From f2cf789e7ec71b2d21534546a99e89b4e86d931c Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Wed, 11 Feb 2004 17:43:44 +0000 Subject: [PATCH] bitkeeper revision 1.717 (402a69d0603eYoV240buOqj3mgegjA) Many files: Move everything except the Python toolset to 64-bit domain identifiers. .del-block.c~add8486d96ee5b5f: Delete: xen/common/block.c --- .rootkeys | 1 - tools/xc/lib/xc.h | 59 +++-- tools/xc/lib/xc_bvtsched.c | 2 +- tools/xc/lib/xc_domain.c | 23 +- tools/xc/lib/xc_linux_build.c | 9 +- tools/xc/lib/xc_linux_restore.c | 16 +- tools/xc/lib/xc_linux_save.c | 6 +- tools/xc/lib/xc_netbsd_build.c | 9 +- tools/xc/lib/xc_private.h | 9 - tools/xc/lib/xc_vbd.c | 14 +- tools/xc/lib/xc_vif.c | 6 +- tools/xc/py/Xc.c | 221 +++++++++-------- xen/arch/i386/i387.c | 6 +- xen/arch/i386/pdb-stub.c | 2 +- xen/arch/i386/process.c | 2 +- xen/arch/i386/smpboot.c | 4 +- xen/arch/i386/traps.c | 11 +- xen/common/block.c | 22 -- xen/common/debug-linux.c | 10 +- xen/common/debug.c | 21 +- xen/common/dom0_ops.c | 39 ++- xen/common/domain.c | 61 +++-- xen/common/kernel.c | 6 +- xen/common/keyhandler.c | 2 +- xen/common/network.c | 231 +++++++++--------- xen/common/schedule.c | 6 +- xen/drivers/block/xen_block.c | 2 +- xen/include/asm-i386/i387.h | 5 +- xen/include/asm-i386/pdb.h | 8 +- xen/include/hypervisor-ifs/block.h | 2 +- xen/include/hypervisor-ifs/dom0_ops.h | 30 +-- xen/include/hypervisor-ifs/hypervisor-if.h | 7 +- xen/include/hypervisor-ifs/network.h | 25 +- xen/include/hypervisor-ifs/vbd.h | 16 +- xen/include/xeno/sched.h | 39 ++- xen/include/xeno/vif.h | 4 +- xen/net/dev.c | 2 +- .../arch/xeno/drivers/dom0/vfr.c | 33 ++- .../arch/xeno/drivers/network/network.c | 16 +- .../arch/xeno/kernel/head.S | 4 +- .../arch/xeno/kernel/ioport.c | 2 +- .../arch/xeno/kernel/process.c | 2 +- .../arch/xeno/kernel/setup.c | 4 +- .../arch/xeno/kernel/time.c | 7 +- .../include/asm-xeno/keyboard.h | 7 +- 45 files changed, 522 insertions(+), 491 deletions(-) delete mode 100644 xen/common/block.c diff --git a/.rootkeys b/.rootkeys index a487b18871..227493e410 100644 --- a/.rootkeys +++ b/.rootkeys @@ -126,7 +126,6 @@ 3ddb79bcOMCu9-5mKpjIh5d0qqBDPg xen/arch/i386/xeno.lds 3ddb79bdff-gj-jFGKjOejeHLqL8Lg xen/common/Makefile 3e397e66AyyD5fYraAySWuwi9uqSXg xen/common/ac_timer.c -3ddb79bddEYJbcURvqqcx99Yl2iAhQ xen/common/block.c 3ddb79bdrqnW93GR9gZk1OJe1qK-iQ xen/common/brlock.c 3fb10d07GscSWPKxBqpvNfU-dYfa0g xen/common/console.c 4022a73c_BbDFd2YJ_NQYVvKX5Oz7w xen/common/debug-linux.c diff --git a/tools/xc/lib/xc.h b/tools/xc/lib/xc.h index 290d69649a..11252852c0 100644 --- a/tools/xc/lib/xc.h +++ b/tools/xc/lib/xc.h @@ -9,12 +9,21 @@ #ifndef __XC_H__ #define __XC_H__ +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned long u32; +typedef unsigned long long u64; +typedef signed char s8; +typedef signed short s16; +typedef signed long s32; +typedef signed long long s64; + /* Obtain or relinquish a handle on the 'xc' library. */ int xc_interface_open(void); int xc_interface_close(int xc_handle); typedef struct { - unsigned int domid; + u64 domid; unsigned int cpu; int has_cpu; int stopped; @@ -26,44 +35,46 @@ typedef struct { int xc_domain_create(int xc_handle, unsigned int mem_kb, - const char *name); + const char *name, + u64 *pdomid); int xc_domain_start(int xc_handle, - unsigned int domid); + u64 domid); int xc_domain_stop(int xc_handle, - unsigned int domid); + u64 domid); int xc_domain_destroy(int xc_handle, - unsigned int domid, + u64 domid, int force); int xc_domain_pincpu(int xc_handle, - unsigned int domid, + u64 domid, int cpu); int xc_domain_getinfo(int xc_handle, - unsigned int first_domid, + u64 first_domid, unsigned int max_doms, xc_dominfo_t *info); int xc_linux_save(int xc_handle, - unsigned int domid, + u64 domid, const char *state_file, int verbose); int xc_linux_restore(int xc_handle, const char *state_file, - int verbose); + int verbose, + u64 *pdomid); int xc_linux_build(int xc_handle, - unsigned int domid, + u64 domid, const char *image_name, const char *ramdisk_name, const char *cmdline); int xc_netbsd_build(int xc_handle, - unsigned int domid, + u64 domid, const char *image_name, const char *cmdline); int xc_bvtsched_global_set(int xc_handle, unsigned long ctx_allow); int xc_bvtsched_domain_set(int xc_handle, - unsigned int domid, + u64 domid, unsigned long mcuadv, unsigned long warp, unsigned long warpl, @@ -80,21 +91,21 @@ typedef struct { } xc_vif_stats_t; int xc_vif_scheduler_set(int xc_handle, - unsigned int domid, + u64 domid, unsigned int vifid, xc_vif_sched_params_t *params); int xc_vif_scheduler_get(int xc_handle, - unsigned int domid, + u64 domid, unsigned int vifid, xc_vif_sched_params_t *params); int xc_vif_stats_get(int xc_handle, - unsigned int domid, + u64 domid, unsigned int vifid, xc_vif_stats_t *stats); typedef struct { -#define XC_VBDDOM_PROBE_ALL (~0U) - unsigned int domid; +#define XC_VBDDOM_PROBE_ALL (~0ULL) + u64 domid; unsigned short vbdid; #define XC_VBDF_WRITEABLE (1<<0) unsigned long flags; @@ -108,32 +119,32 @@ typedef struct { } xc_vbdextent_t; int xc_vbd_create(int xc_handle, - unsigned int domid, + u64 domid, unsigned short vbdid, int writeable); int xc_vbd_destroy(int xc_handle, - unsigned int domid, + u64 domid, unsigned short vbdid); int xc_vbd_grow(int xc_handle, - unsigned int domid, + u64 domid, unsigned short vbdid, xc_vbdextent_t *extent); int xc_vbd_shrink(int xc_handle, - unsigned int domid, + u64 domid, unsigned short vbdid); int xc_vbd_setextents(int xc_handle, - unsigned int domid, + u64 domid, unsigned short vbdid, unsigned int nr_extents, xc_vbdextent_t *extents); int xc_vbd_getextents(int xc_handle, - unsigned int domid, + u64 domid, unsigned short vbdid, unsigned int max_extents, xc_vbdextent_t *extents, int *writeable); int xc_vbd_probe(int xc_handle, - unsigned int domid, + u64 domid, unsigned int max_vbds, xc_vbd_t *vbds); diff --git a/tools/xc/lib/xc_bvtsched.c b/tools/xc/lib/xc_bvtsched.c index 5ea52224e9..6dc532df1f 100644 --- a/tools/xc/lib/xc_bvtsched.c +++ b/tools/xc/lib/xc_bvtsched.c @@ -18,7 +18,7 @@ int xc_bvtsched_global_set(int xc_handle, } int xc_bvtsched_domain_set(int xc_handle, - unsigned int domid, + domid_t domid, unsigned long mcuadv, unsigned long warp, unsigned long warpl, diff --git a/tools/xc/lib/xc_domain.c b/tools/xc/lib/xc_domain.c index 5601fb485c..669138fd9b 100644 --- a/tools/xc/lib/xc_domain.c +++ b/tools/xc/lib/xc_domain.c @@ -10,7 +10,8 @@ int xc_domain_create(int xc_handle, unsigned int mem_kb, - const char *name) + const char *name, + domid_t *pdomid) { int err; dom0_op_t op; @@ -20,14 +21,15 @@ int xc_domain_create(int xc_handle, strncpy(op.u.createdomain.name, name, MAX_DOMAIN_NAME); op.u.createdomain.name[MAX_DOMAIN_NAME-1] = '\0'; - err = do_dom0_op(xc_handle, &op); + if ( (err = do_dom0_op(xc_handle, &op)) == 0 ) + *pdomid = op.u.createdomain.domain; - return (err < 0) ? err : op.u.createdomain.domain; + return err; } int xc_domain_start(int xc_handle, - unsigned int domid) + domid_t domid) { dom0_op_t op; op.cmd = DOM0_STARTDOMAIN; @@ -37,7 +39,7 @@ int xc_domain_start(int xc_handle, int xc_domain_stop(int xc_handle, - unsigned int domid) + domid_t domid) { dom0_op_t op; op.cmd = DOM0_STOPDOMAIN; @@ -47,7 +49,7 @@ int xc_domain_stop(int xc_handle, int xc_domain_destroy(int xc_handle, - unsigned int domid, + domid_t domid, int force) { dom0_op_t op; @@ -58,8 +60,8 @@ int xc_domain_destroy(int xc_handle, } int xc_domain_pincpu(int xc_handle, - unsigned int domid, - int cpu) + domid_t domid, + int cpu) { dom0_op_t op; op.cmd = DOM0_PINCPUDOMAIN; @@ -70,11 +72,12 @@ int xc_domain_pincpu(int xc_handle, int xc_domain_getinfo(int xc_handle, - unsigned int first_domid, + domid_t first_domid, unsigned int max_doms, xc_dominfo_t *info) { - unsigned int nr_doms, next_domid = first_domid; + unsigned int nr_doms; + domid_t next_domid = first_domid; dom0_op_t op; for ( nr_doms = 0; nr_doms < max_doms; nr_doms++ ) diff --git a/tools/xc/lib/xc_linux_build.c b/tools/xc/lib/xc_linux_build.c index 37ece2c7c9..0071ddf94d 100644 --- a/tools/xc/lib/xc_linux_build.c +++ b/tools/xc/lib/xc_linux_build.c @@ -12,7 +12,7 @@ #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED) #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER) -static long get_tot_pages(int xc_handle, int domid) +static long get_tot_pages(int xc_handle, domid_t domid) { dom0_op_t op; op.cmd = DOM0_GETDOMAININFO; @@ -22,7 +22,7 @@ static long get_tot_pages(int xc_handle, int domid) } static int get_pfn_list(int xc_handle, - int domid, + domid_t domid, unsigned long *pfn_buf, unsigned long max_pfns) { @@ -96,7 +96,7 @@ static int copy_to_domain_page(int pm_handle, } static int setup_guestos(int xc_handle, - int dom, + domid_t dom, gzFile kernel_gfd, gzFile initrd_gfd, unsigned long tot_pages, @@ -282,7 +282,6 @@ static int setup_guestos(int xc_handle, start_info->mod_len = initrd_len; start_info->nr_pages = tot_pages; start_info->shared_info = shared_info_frame << PAGE_SHIFT; - start_info->dom_id = dom; start_info->flags = 0; strncpy(start_info->cmd_line, cmdline, MAX_CMD_LEN); start_info->cmd_line[MAX_CMD_LEN-1] = '\0'; @@ -313,7 +312,7 @@ static int setup_guestos(int xc_handle, } int xc_linux_build(int xc_handle, - unsigned int domid, + domid_t domid, const char *image_name, const char *ramdisk_name, const char *cmdline) diff --git a/tools/xc/lib/xc_linux_restore.c b/tools/xc/lib/xc_linux_restore.c index 44ebe3c940..7afb239d91 100644 --- a/tools/xc/lib/xc_linux_restore.c +++ b/tools/xc/lib/xc_linux_restore.c @@ -19,7 +19,7 @@ } while ( 0 ) static int get_pfn_list(int xc_handle, - int domain_id, + domid_t domain_id, unsigned long *pfn_buf, unsigned long max_pfns) { @@ -103,11 +103,13 @@ static int checked_read(gzFile fd, void *buf, size_t count) int xc_linux_restore(int xc_handle, const char *state_file, - int verbose) + int verbose, + domid_t *pdomid) { dom0_op_t op; int rc = 1, i, j; - unsigned long mfn, pfn, dom = 0; + unsigned long mfn, pfn; + domid_t dom = 0; unsigned int prev_pc, this_pc; /* Number of page frames in use by this XenoLinux session. */ @@ -370,7 +372,6 @@ int xc_linux_restore(int xc_handle, p_srec = map_pfn(pm_handle, mfn); p_srec->resume_info.nr_pages = nr_pfns; p_srec->resume_info.shared_info = shared_info_frame << PAGE_SHIFT; - p_srec->resume_info.dom_id = dom; p_srec->resume_info.flags = 0; unmap_pfn(pm_handle, p_srec); @@ -470,7 +471,7 @@ int xc_linux_restore(int xc_handle, else { /* Success: print the domain id. */ - verbose_printf("DOM=%ld\n", dom); + verbose_printf("DOM=%llu\n", dom); } if ( pm_handle >= 0 ) @@ -483,5 +484,8 @@ int xc_linux_restore(int xc_handle, gzclose(gfd); - return (rc == 0) ? dom : rc; + if ( rc == 0 ) + *pdomid = dom; + + return rc; } diff --git a/tools/xc/lib/xc_linux_save.c b/tools/xc/lib/xc_linux_save.c index 42ed198a71..62c4d379dd 100644 --- a/tools/xc/lib/xc_linux_save.c +++ b/tools/xc/lib/xc_linux_save.c @@ -40,7 +40,7 @@ static int check_pfn_ownership(int xc_handle, unsigned long mfn, - unsigned int dom) + domid_t dom) { dom0_op_t op; op.cmd = DOM0_GETPAGEFRAMEINFO; @@ -52,7 +52,7 @@ static int check_pfn_ownership(int xc_handle, #define GETPFN_ERR (~0U) static unsigned int get_pfn_type(int xc_handle, unsigned long mfn, - unsigned int dom) + domid_t dom) { dom0_op_t op; op.cmd = DOM0_GETPAGEFRAMEINFO; @@ -75,7 +75,7 @@ static int checked_write(gzFile fd, void *buf, size_t count) } int xc_linux_save(int xc_handle, - unsigned int domid, + domid_t domid, const char *state_file, int verbose) { diff --git a/tools/xc/lib/xc_netbsd_build.c b/tools/xc/lib/xc_netbsd_build.c index f971546ef4..4da93b7023 100644 --- a/tools/xc/lib/xc_netbsd_build.c +++ b/tools/xc/lib/xc_netbsd_build.c @@ -22,7 +22,7 @@ static int loadelfimage(gzFile, int, unsigned long *, unsigned long, #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED) #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER) -static long get_tot_pages(int xc_handle, int domid) +static long get_tot_pages(int xc_handle, domid_t domid) { dom0_op_t op; op.cmd = DOM0_GETDOMAININFO; @@ -32,7 +32,7 @@ static long get_tot_pages(int xc_handle, int domid) } static int get_pfn_list(int xc_handle, - int domid, + domid_t domid, unsigned long *pfn_buf, unsigned long max_pfns) { @@ -75,7 +75,7 @@ static int send_pgupdates(int xc_handle, mmu_update_t *updates, int nr_updates) } static int setup_guestos(int xc_handle, - int dom, + domid_t dom, gzFile kernel_gfd, unsigned long tot_pages, unsigned long *virt_startinfo_addr, @@ -218,7 +218,6 @@ static int setup_guestos(int xc_handle, start_info->mod_len = symtab_len; start_info->nr_pages = tot_pages; start_info->shared_info = shared_info_frame << PAGE_SHIFT; - start_info->dom_id = dom; start_info->flags = 0; strncpy(start_info->cmd_line, cmdline, MAX_CMD_LEN); start_info->cmd_line[MAX_CMD_LEN-1] = '\0'; @@ -249,7 +248,7 @@ static int setup_guestos(int xc_handle, } int xc_netbsd_build(int xc_handle, - unsigned int domid, + domid_t domid, const char *image_name, const char *cmdline) { diff --git a/tools/xc/lib/xc_private.h b/tools/xc/lib/xc_private.h index 84ce9350cf..f5e2c25247 100644 --- a/tools/xc/lib/xc_private.h +++ b/tools/xc/lib/xc_private.h @@ -2,15 +2,6 @@ #ifndef __XC_PRIVATE_H__ #define __XC_PRIVATE_H__ -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned long u32; -typedef unsigned long long u64; -typedef signed char s8; -typedef signed short s16; -typedef signed long s32; -typedef signed long long s64; - #include #include #include diff --git a/tools/xc/lib/xc_vbd.c b/tools/xc/lib/xc_vbd.c index e0fa580daf..76a0e6814d 100644 --- a/tools/xc/lib/xc_vbd.c +++ b/tools/xc/lib/xc_vbd.c @@ -10,7 +10,7 @@ #include "xc_private.h" int xc_vbd_create(int xc_handle, - unsigned int domid, + domid_t domid, unsigned short vbdid, int writeable) { @@ -24,7 +24,7 @@ int xc_vbd_create(int xc_handle, int xc_vbd_destroy(int xc_handle, - unsigned int domid, + domid_t domid, unsigned short vbdid) { block_io_op_t op; @@ -36,7 +36,7 @@ int xc_vbd_destroy(int xc_handle, int xc_vbd_grow(int xc_handle, - unsigned int domid, + domid_t domid, unsigned short vbdid, xc_vbdextent_t *extent) { @@ -52,7 +52,7 @@ int xc_vbd_grow(int xc_handle, int xc_vbd_shrink(int xc_handle, - unsigned int domid, + domid_t domid, unsigned short vbdid) { block_io_op_t op; @@ -64,7 +64,7 @@ int xc_vbd_shrink(int xc_handle, int xc_vbd_setextents(int xc_handle, - unsigned int domid, + domid_t domid, unsigned short vbdid, unsigned int nr_extents, xc_vbdextent_t *extents) @@ -110,7 +110,7 @@ int xc_vbd_setextents(int xc_handle, int xc_vbd_getextents(int xc_handle, - unsigned int domid, + domid_t domid, unsigned short vbdid, unsigned int max_extents, xc_vbdextent_t *extents, @@ -159,7 +159,7 @@ int xc_vbd_getextents(int xc_handle, int xc_vbd_probe(int xc_handle, - unsigned int domid, + domid_t domid, unsigned int max_vbds, xc_vbd_t *vbds) { diff --git a/tools/xc/lib/xc_vif.c b/tools/xc/lib/xc_vif.c index 645be0762d..c73e2dde72 100644 --- a/tools/xc/lib/xc_vif.c +++ b/tools/xc/lib/xc_vif.c @@ -9,7 +9,7 @@ #include "xc_private.h" int xc_vif_scheduler_set(int xc_handle, - unsigned int domid, + domid_t domid, unsigned int vifid, xc_vif_sched_params_t *params) { @@ -24,7 +24,7 @@ int xc_vif_scheduler_set(int xc_handle, int xc_vif_scheduler_get(int xc_handle, - unsigned int domid, + domid_t domid, unsigned int vifid, xc_vif_sched_params_t *params) { @@ -46,7 +46,7 @@ int xc_vif_scheduler_get(int xc_handle, int xc_vif_stats_get(int xc_handle, - unsigned int domid, + domid_t domid, unsigned int vifid, xc_vif_stats_t *stats) { diff --git a/tools/xc/py/Xc.c b/tools/xc/py/Xc.c index d1052efd93..8e3f5f7dcb 100644 --- a/tools/xc/py/Xc.c +++ b/tools/xc/py/Xc.c @@ -24,6 +24,7 @@ static PyObject *pyxc_domain_create(PyObject *self, unsigned int mem_kb = 65536; char *name = "(anon)"; + u64 dom; int ret; static char *kwd_list[] = { "mem_kb", "name", NULL }; @@ -32,9 +33,10 @@ static PyObject *pyxc_domain_create(PyObject *self, &mem_kb, &name) ) return NULL; - ret = xc_domain_create(xc->xc_handle, mem_kb, name); - - return PyInt_FromLong(ret); + if ( (ret = xc_domain_create(xc->xc_handle, mem_kb, name, &dom)) < 0 ) + return PyLong_FromLong(ret); + + return PyLong_FromUnsignedLongLong(dom); } static PyObject *pyxc_domain_start(PyObject *self, @@ -43,12 +45,12 @@ static PyObject *pyxc_domain_start(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom; - int ret; + u64 dom; + int ret; static char *kwd_list[] = { "dom", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list, &dom) ) + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "L", kwd_list, &dom) ) return NULL; ret = xc_domain_start(xc->xc_handle, dom); @@ -62,12 +64,12 @@ static PyObject *pyxc_domain_stop(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom; - int ret; + u64 dom; + int ret; static char *kwd_list[] = { "dom", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list, &dom) ) + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "L", kwd_list, &dom) ) return NULL; ret = xc_domain_stop(xc->xc_handle, dom); @@ -81,12 +83,12 @@ static PyObject *pyxc_domain_destroy(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom; - int force = 0, ret; + u64 dom; + int force = 0, ret; static char *kwd_list[] = { "dom", "force", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "L|i", kwd_list, &dom, &force) ) return NULL; @@ -101,12 +103,12 @@ static PyObject *pyxc_domain_pincpu(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom; - int cpu, ret; + u64 dom; + int cpu = -1, ret; static char *kwd_list[] = { "dom", "cpu", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "L|i", kwd_list, &dom, &cpu) ) return NULL; @@ -122,13 +124,13 @@ static PyObject *pyxc_domain_getinfo(PyObject *self, XcObject *xc = (XcObject *)self; PyObject *list; - unsigned int first_dom = 0, max_doms = 1024; - int nr_doms, i; + u64 first_dom = 0; + int max_doms = 1024, nr_doms, i; xc_dominfo_t *info; static char *kwd_list[] = { "first_dom", "max_doms", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|Li", kwd_list, &first_dom, &max_doms) ) return NULL; @@ -143,7 +145,7 @@ static PyObject *pyxc_domain_getinfo(PyObject *self, { PyList_SetItem( list, i, - Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:L,s:s}", + Py_BuildValue("{s:L,s:i,s:i,s:i,s:l,s:L,s:s}", "dom", info[i].domid, "cpu", info[i].cpu, "running", info[i].has_cpu, @@ -165,13 +167,13 @@ static PyObject *pyxc_linux_save(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom; - char *state_file; - int progress = 1, ret; + u64 dom; + char *state_file; + int progress = 1, ret; static char *kwd_list[] = { "dom", "state_file", "progress", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is|i", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Ls|i", kwd_list, &dom, &state_file, &progress) ) return NULL; @@ -188,6 +190,7 @@ static PyObject *pyxc_linux_restore(PyObject *self, char *state_file; int progress = 1, ret; + u64 dom; static char *kwd_list[] = { "state_file", "progress", NULL }; @@ -195,9 +198,11 @@ static PyObject *pyxc_linux_restore(PyObject *self, &state_file, &progress) ) return NULL; - ret = xc_linux_restore(xc->xc_handle, state_file, progress); - - return PyInt_FromLong(ret); + ret = xc_linux_restore(xc->xc_handle, state_file, progress, &dom); + if ( ret < 0 ) + return PyLong_FromLong(ret); + + return PyLong_FromUnsignedLongLong(dom); } static PyObject *pyxc_linux_build(PyObject *self, @@ -206,13 +211,13 @@ static PyObject *pyxc_linux_build(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom; - char *image, *ramdisk = NULL, *cmdline = ""; - int ret; + u64 dom; + char *image, *ramdisk = NULL, *cmdline = ""; + int ret; static char *kwd_list[] = { "dom", "image", "ramdisk", "cmdline", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is|ss", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Ls|ss", kwd_list, &dom, &image, &ramdisk, &cmdline) ) return NULL; @@ -227,13 +232,13 @@ static PyObject *pyxc_netbsd_build(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom; - char *image, *ramdisk = NULL, *cmdline = ""; - int ret; + u64 dom; + char *image, *ramdisk = NULL, *cmdline = ""; + int ret; static char *kwd_list[] = { "dom", "image", "ramdisk", "cmdline", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is|ss", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Ls|ss", kwd_list, &dom, &image, &ramdisk, &cmdline) ) return NULL; @@ -267,14 +272,14 @@ static PyObject *pyxc_bvtsched_domain_set(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom; + u64 dom; unsigned long mcuadv, warp, warpl, warpu; int ret; static char *kwd_list[] = { "dom", "mcuadv", "warp", "warpl", "warpu", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "illll", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Lllll", kwd_list, &dom, &mcuadv, &warp, &warpl, &warpu) ) return NULL; @@ -290,14 +295,15 @@ static PyObject *pyxc_vif_scheduler_set(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom, vif; + u64 dom; + unsigned int vif; xc_vif_sched_params_t sched = { 0, 0 }; int ret; static char *kwd_list[] = { "dom", "vif", "credit_bytes", "credit_usecs", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii|ll", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li|ll", kwd_list, &dom, &vif, &sched.credit_bytes, &sched.credit_usec) ) @@ -315,13 +321,14 @@ static PyObject *pyxc_vif_scheduler_get(PyObject *self, XcObject *xc = (XcObject *)self; PyObject *dict; - unsigned int dom, vif; + u64 dom; + unsigned int vif; xc_vif_sched_params_t sched; int ret; static char *kwd_list[] = { "dom", "vif", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, &dom, &vif) ) return NULL; @@ -344,13 +351,14 @@ static PyObject *pyxc_vif_stats_get(PyObject *self, XcObject *xc = (XcObject *)self; PyObject *dict; - unsigned int dom, vif; + u64 dom; + unsigned int vif; xc_vif_stats_t stats; - int ret; + int ret; static char *kwd_list[] = { "dom", "vif", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, &dom, &vif) ) return NULL; @@ -374,12 +382,13 @@ static PyObject *pyxc_vbd_create(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom, vbd; + u64 dom; + unsigned int vbd; int writeable, ret; static char *kwd_list[] = { "dom", "vbd", "writeable", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iii", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Lii", kwd_list, &dom, &vbd, &writeable) ) return NULL; @@ -394,12 +403,13 @@ static PyObject *pyxc_vbd_destroy(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom, vbd; + u64 dom; + unsigned int vbd; int ret; static char *kwd_list[] = { "dom", "vbd", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, &dom, &vbd) ) return NULL; @@ -414,14 +424,15 @@ static PyObject *pyxc_vbd_grow(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom, vbd; + u64 dom; + unsigned int vbd; xc_vbdextent_t extent; int ret; static char *kwd_list[] = { "dom", "vbd", "device", "start_sector", "nr_sectors", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiill", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Liill", kwd_list, &dom, &vbd, &extent.real_device, &extent.start_sector, @@ -439,12 +450,13 @@ static PyObject *pyxc_vbd_shrink(PyObject *self, { XcObject *xc = (XcObject *)self; - unsigned int dom, vbd; - int ret; + u64 dom; + unsigned int vbd; + int ret; static char *kwd_list[] = { "dom", "vbd", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, &dom, &vbd) ) return NULL; @@ -460,13 +472,14 @@ static PyObject *pyxc_vbd_setextents(PyObject *self, XcObject *xc = (XcObject *)self; PyObject *list, *dict, *obj; - unsigned int dom, vbd; + u64 dom; + unsigned int vbd; xc_vbdextent_t *extents = NULL; int ret, i, nr_extents; static char *kwd_list[] = { "dom", "vbd", "extents", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiO", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "LiO", kwd_list, &dom, &vbd, &list) ) goto fail; @@ -520,13 +533,14 @@ static PyObject *pyxc_vbd_getextents(PyObject *self, XcObject *xc = (XcObject *)self; PyObject *list; - unsigned int dom, vbd; + u64 dom; + unsigned int vbd; xc_vbdextent_t *extents; int i, nr_extents, max_extents; static char *kwd_list[] = { "dom", "vbd", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, &dom, &vbd) ) return NULL; @@ -570,13 +584,14 @@ static PyObject *pyxc_vbd_probe(PyObject *self, XcObject *xc = (XcObject *)self; PyObject *list; - unsigned int dom = XC_VBDDOM_PROBE_ALL, max_vbds = 1024; + u64 dom = XC_VBDDOM_PROBE_ALL; + unsigned int max_vbds = 1024; xc_vbd_t *info; int nr_vbds, i; static char *kwd_list[] = { "dom", "max_vbds", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|Li", kwd_list, &dom, &max_vbds) ) return NULL; @@ -591,7 +606,7 @@ static PyObject *pyxc_vbd_probe(PyObject *self, { PyList_SetItem( list, i, - Py_BuildValue("{s:i,s:i,s:i,s:l}", + Py_BuildValue("{s:L,s:i,s:i,s:l}", "dom", info[i].domid, "vbd", info[i].vbdid, "writeable", !!(info[i].flags & XC_VBDF_WRITEABLE), @@ -631,27 +646,27 @@ static PyMethodDef pyxc_methods[] = { "Create a new domain.\n" " mem_kb [int, 65536]: Memory allocation, in kilobytes.\n" " name [str, '(anon)']: Informative textual name.\n\n" - "Returns: [int] new domain identifier; -1 on error.\n" }, + "Returns: [long] new domain identifier; -1 on error.\n" }, { "domain_start", (PyCFunction)pyxc_domain_start, METH_VARARGS | METH_KEYWORDS, "\n" "Start execution of a domain.\n" - " dom [int]: Identifier of domain to be started.\n\n" + " dom [long]: Identifier of domain to be started.\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "domain_stop", (PyCFunction)pyxc_domain_stop, METH_VARARGS | METH_KEYWORDS, "\n" "Stop execution of a domain.\n" - " dom [int]: Identifier of domain to be stopped.\n\n" + " dom [long]: Identifier of domain to be stopped.\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "domain_destroy", (PyCFunction)pyxc_domain_destroy, METH_VARARGS | METH_KEYWORDS, "\n" "Destroy a domain.\n" - " dom [int]: Identifier of domain to be destroyed.\n" + " dom [long]: Identifier of domain to be destroyed.\n" " force [int, 0]: Bool - force immediate destruction?\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, @@ -659,21 +674,21 @@ static PyMethodDef pyxc_methods[] = { (PyCFunction)pyxc_domain_pincpu, METH_VARARGS | METH_KEYWORDS, "\n" "Pin a domain to a specified CPU.\n" - " dom [int]: Identifier of domain to be destroyed.\n" - " force [int, -1]: CPU to pin to, or -1 to unpin\n\n" + " dom [long]: Identifier of domain to be destroyed.\n" + " cpu [int, -1]: CPU to pin to, or -1 to unpin\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "domain_getinfo", (PyCFunction)pyxc_domain_getinfo, METH_VARARGS | METH_KEYWORDS, "\n" "Get information regarding a set of domains, in increasing id order.\n" - " first_dom [int, 0]: First domain to retrieve info about.\n" + " first_dom [long, 0]: First domain to retrieve info about.\n" " max_doms [int, 1024]: Maximum number of domains to retrieve info" " about.\n\n" "Returns: [list of dicts] if list length is less than 'max_doms'\n" " parameter then there was an error, or the end of the\n" " domain-id space was reached.\n" - " dom [int]: Identifier of domain to which this info pertains\n" + " dom [long]: Identifier of domain to which this info pertains\n" " cpu [int]: CPU to which this domain is bound\n" " running [int]: Bool - is the domain currently running?\n" " stopped [int]: Bool - is the domain suspended?\n" @@ -685,7 +700,7 @@ static PyMethodDef pyxc_methods[] = { (PyCFunction)pyxc_linux_save, METH_VARARGS | METH_KEYWORDS, "\n" "Save the CPU and memory state of a Linux guest OS.\n" - " dom [int]: Identifier of domain to be saved.\n" + " dom [long]: Identifier of domain to be saved.\n" " state_file [str]: Name of state file. Must not currently exist.\n" " progress [int, 1]: Bool - display a running progress indication?\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, @@ -696,26 +711,26 @@ static PyMethodDef pyxc_methods[] = { "Restore the CPU and memory state of a Linux guest OS.\n" " state_file [str]: Name of state file. Must not currently exist.\n" " progress [int, 1]: Bool - display a running progress indication?\n\n" - "Returns: [int] new domain identifier on success; -1 on error.\n" }, + "Returns: [long] new domain identifier on success; -1 on error.\n" }, { "linux_build", (PyCFunction)pyxc_linux_build, METH_VARARGS | METH_KEYWORDS, "\n" "Build a new Linux guest OS.\n" - " dom [int]: Identifier of domain to build into.\n" + " dom [long]: Identifier of domain to build into.\n" " image [str]: Name of kernel image file. May be gzipped.\n" " ramdisk [str, n/a]: Name of ramdisk file, if any.\n" " cmdline [str, n/a]: Kernel parameters, if any.\n\n" - "Returns: [int] new domain identifier on success; -1 on error.\n" }, + "Returns: [int] 0 on success; -1 on error.\n" }, { "netbsd_build", (PyCFunction)pyxc_netbsd_build, METH_VARARGS | METH_KEYWORDS, "\n" "Build a new NetBSD guest OS.\n" - " dom [int]: Identifier of domain to build into.\n" + " dom [long]: Identifier of domain to build into.\n" " image [str]: Name of kernel image file. May be gzipped.\n" " cmdline [str, n/a]: Kernel parameters, if any.\n\n" - "Returns: [int] new domain identifier on success; -1 on error.\n" }, + "Returns: [int] 0 on success; -1 on error.\n" }, { "bvtsched_global_set", (PyCFunction)pyxc_bvtsched_global_set, @@ -728,18 +743,18 @@ static PyMethodDef pyxc_methods[] = { (PyCFunction)pyxc_bvtsched_domain_set, METH_VARARGS | METH_KEYWORDS, "\n" "Set per-domain tuning parameters for Borrowed Virtual Time scheduler.\n" - " dom [int]: Identifier of domain to be tuned.\n" - " mcuadv [int]: Internal BVT parameter.\n" - " warp [int]: Internal BVT parameter.\n" - " warpl [int]: Internal BVT parameter.\n" - " warpu [int]: Internal BVT parameter.\n\n" + " dom [long]: Identifier of domain to be tuned.\n" + " mcuadv [int]: Internal BVT parameter.\n" + " warp [int]: Internal BVT parameter.\n" + " warpl [int]: Internal BVT parameter.\n" + " warpu [int]: Internal BVT parameter.\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "vif_scheduler_set", (PyCFunction)pyxc_vif_scheduler_set, METH_VARARGS | METH_KEYWORDS, "\n" "Set per-network-interface scheduling parameters.\n" - " dom [int]: Identifier of domain to be adjusted.\n" + " dom [long]: Identifier of domain to be adjusted.\n" " vif [int]: Identifier of VIF to be adjusted.\n" " credit_bytes [int, 0]: Tx bytes permitted each interval.\n" " credit_usecs [int, 0]: Interval, in usecs. 0 == no scheduling.\n\n" @@ -749,7 +764,7 @@ static PyMethodDef pyxc_methods[] = { (PyCFunction)pyxc_vif_scheduler_get, METH_VARARGS | METH_KEYWORDS, "\n" "Query the per-network-interface scheduling parameters.\n" - " dom [int]: Identifier of domain to be queried.\n" + " dom [long]: Identifier of domain to be queried.\n" " vif [int]: Identifier of VIF to be queried.\n\n" "Returns: [dict] dictionary is empty on failure.\n" " credit_bytes [int]: Tx bytes permitted each interval.\n" @@ -759,8 +774,8 @@ static PyMethodDef pyxc_methods[] = { (PyCFunction)pyxc_vif_stats_get, METH_VARARGS | METH_KEYWORDS, "\n" "Query the per-network-interface statistics.\n" - " dom [int]: Identifier of domain to be queried.\n" - " vif [int]: Identifier of VIF to be queried.\n\n" + " dom [long]: Identifier of domain to be queried.\n" + " vif [int]: Identifier of VIF to be queried.\n\n" "Returns: [dict] dictionary is empty on failure.\n" " tx_bytes [long]: Bytes transmitted.\n" " tx_packets [long]: Packets transmitted.\n" @@ -771,44 +786,44 @@ static PyMethodDef pyxc_methods[] = { (PyCFunction)pyxc_vbd_create, METH_VARARGS | METH_KEYWORDS, "\n" "Create a new virtual block device associated with a given domain.\n" - " dom [int]: Identifier of domain to get a new VBD.\n" - " vbd [int]: Identifier for new VBD.\n" - " writeable [int]: Bool - is the new VBD writeable?\n\n" + " dom [long]: Identifier of domain to get a new VBD.\n" + " vbd [int]: Identifier for new VBD.\n" + " writeable [int]: Bool - is the new VBD writeable?\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "vbd_destroy", (PyCFunction)pyxc_vbd_destroy, METH_VARARGS | METH_KEYWORDS, "\n" "Destroy a virtual block device.\n" - " dom [int]: Identifier of domain containing the VBD.\n" - " vbd [int]: Identifier of the VBD.\n\n" + " dom [long]: Identifier of domain containing the VBD.\n" + " vbd [int]: Identifier of the VBD.\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "vbd_grow", (PyCFunction)pyxc_vbd_grow, METH_VARARGS | METH_KEYWORDS, "\n" "Grow a virtual block device by appending a new extent.\n" - " dom [int]: Identifier of domain containing the VBD.\n" - " vbd [int]: Identifier of the VBD.\n" - " device [int]: Identifier of the real underlying block device.\n" - " start_sector [int]: Real start sector of this extent.\n" - " nr_sectors [int]: Length, in sectors, of this extent.\n\n" + " dom [long]: Identifier of domain containing the VBD.\n" + " vbd [int]: Identifier of the VBD.\n" + " device [int]: Identifier of the real underlying block device.\n" + " start_sector [int]: Real start sector of this extent.\n" + " nr_sectors [int]: Length, in sectors, of this extent.\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "vbd_shrink", (PyCFunction)pyxc_vbd_shrink, METH_VARARGS | METH_KEYWORDS, "\n" "Shrink a virtual block device by deleting its final extent.\n" - " dom [int]: Identifier of domain containing the VBD.\n" - " vbd [int]: Identifier of the VBD.\n\n" + " dom [long]: Identifier of domain containing the VBD.\n" + " vbd [int]: Identifier of the VBD.\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "vbd_setextents", (PyCFunction)pyxc_vbd_setextents, METH_VARARGS | METH_KEYWORDS, "\n" "Set all the extent information for a virtual block device.\n" - " dom [int]: Identifier of domain containing the VBD.\n" - " vbd [int]: Identifier of the VBD.\n" + " dom [long]: Identifier of domain containing the VBD.\n" + " vbd [int]: Identifier of the VBD.\n" " extents [list of dicts]: Per-extent information.\n" " device [int]: Identifier of the real underlying block device.\n" " start_sector [int]: Real start sector of this extent.\n" @@ -819,8 +834,8 @@ static PyMethodDef pyxc_methods[] = { (PyCFunction)pyxc_vbd_getextents, METH_VARARGS | METH_KEYWORDS, "\n" "Get info on all the extents in a virtual block device.\n" - " dom [int]: Identifier of domain containing the VBD.\n" - " vbd [int]: Identifier of the VBD.\n\n" + " dom [long]: Identifier of domain containing the VBD.\n" + " vbd [int]: Identifier of the VBD.\n\n" "Returns: [list of dicts] per-extent information; empty on error.\n" " device [int]: Identifier of the real underlying block device.\n" " start_sector [int]: Real start sector of this extent.\n" @@ -830,14 +845,14 @@ static PyMethodDef pyxc_methods[] = { (PyCFunction)pyxc_vbd_probe, METH_VARARGS | METH_KEYWORDS, "\n" "Get information regarding extant virtual block devices.\n" - " dom [int, ALL]: Domain to query (default is to query all).\n" + " dom [long, ALL]: Domain to query (default is to query all).\n" " max_vbds [int, 1024]: Maximum VBDs to query.\n\n" "Returns: [list of dicts] if list length is less than 'max_vbds'\n" " parameter then there was an error, or there were fewer vbds.\n" - " dom [int]: Domain containing this VBD.\n" - " vbd [int]: Domain-specific identifier of this VBD.\n" - " writeable [int]: Bool - is this VBD writeable?\n" - " nr_sectors [int]: Size of this VBD, in 512-byte sectors.\n" }, + " dom [long]: Domain containing this VBD.\n" + " vbd [int]: Domain-specific identifier of this VBD.\n" + " writeable [int]: Bool - is this VBD writeable?\n" + " nr_sectors [int]: Size of this VBD, in 512-byte sectors.\n" }, { "readconsolering", (PyCFunction)pyxc_readconsolering, diff --git a/xen/arch/i386/i387.c b/xen/arch/i386/i387.c index fe34ff16f5..ac38ab511f 100644 --- a/xen/arch/i386/i387.c +++ b/xen/arch/i386/i387.c @@ -17,7 +17,7 @@ void init_fpu(void) { __asm__("fninit"); if ( cpu_has_xmm ) load_mxcsr(0x1f80); - current->flags |= PF_DONEFPUINIT; + set_bit(PF_DONEFPUINIT, ¤t->flags); } static inline void __save_init_fpu( struct task_struct *tsk ) @@ -29,7 +29,7 @@ static inline void __save_init_fpu( struct task_struct *tsk ) asm volatile( "fnsave %0 ; fwait" : "=m" (tsk->thread.i387.fsave) ); } - tsk->flags &= ~PF_USEDFPU; + clear_bit(PF_USEDFPU, &tsk->flags); } void save_init_fpu( struct task_struct *tsk ) @@ -39,7 +39,7 @@ void save_init_fpu( struct task_struct *tsk ) * This causes us to set the real flag, so we'll need * to temporarily clear it while saving f-p state. */ - if ( tsk->flags & PF_GUEST_STTS ) clts(); + if ( test_bit(PF_GUEST_STTS, &tsk->flags) ) clts(); __save_init_fpu(tsk); stts(); } diff --git a/xen/arch/i386/pdb-stub.c b/xen/arch/i386/pdb-stub.c index 9ec8148750..035e932cb7 100644 --- a/xen/arch/i386/pdb-stub.c +++ b/xen/arch/i386/pdb-stub.c @@ -72,7 +72,7 @@ pdb_process_query (char *ptr) pdb_out_buffer[buf_idx++] = 'm'; while ( (p = p->next_task) != &idle0_task ) { - int domain = p->domain + PDB_DOMAIN_OFFSET; + domid_t domain = p->domain + PDB_DOMAIN_OFFSET; if (count > 0) pdb_out_buffer[buf_idx++] = ','; diff --git a/xen/arch/i386/process.c b/xen/arch/i386/process.c index e75ee1e050..62725ea84d 100644 --- a/xen/arch/i386/process.c +++ b/xen/arch/i386/process.c @@ -289,7 +289,7 @@ void switch_to(struct task_struct *prev_p, struct task_struct *next_p) /* XXX Currently the 'domain' field is ignored! XXX */ -long do_iopl(unsigned int domain, unsigned int new_io_pl) +long do_iopl(domid_t domain, unsigned int new_io_pl) { execution_context_t *ec = get_execution_context(); ec->eflags = (ec->eflags & 0xffffcfff) | ((new_io_pl&3) << 12); diff --git a/xen/arch/i386/smpboot.c b/xen/arch/i386/smpboot.c index 083aa3ce2e..0812c0cdb1 100644 --- a/xen/arch/i386/smpboot.c +++ b/xen/arch/i386/smpboot.c @@ -673,7 +673,9 @@ static void __init do_boot_cpu (int apicid) if ( (idle = do_createdomain(IDLE_DOMAIN_ID, cpu)) == NULL ) panic("failed 'createdomain' for CPU %d", cpu); - + + set_bit(PF_IDLETASK, &idle->flags); + idle->mm.pagetable = mk_pagetable(__pa(idle_pg_table)); map_cpu_to_boot_apicid(cpu, apicid); diff --git a/xen/arch/i386/traps.c b/xen/arch/i386/traps.c index 13ec1a8e6c..86ba116b6d 100644 --- a/xen/arch/i386/traps.c +++ b/xen/arch/i386/traps.c @@ -500,22 +500,21 @@ asmlinkage void math_state_restore(struct pt_regs *regs, long error_code) /* Prevent recursion. */ clts(); - if ( !(current->flags & PF_USEDFPU) ) + if ( !test_bit(PF_USEDFPU, ¤t->flags) ) { - if ( current->flags & PF_DONEFPUINIT ) + if ( test_bit(PF_DONEFPUINIT, ¤t->flags) ) restore_fpu(current); else init_fpu(); - current->flags |= PF_USEDFPU; /* So we fnsave on switch_to() */ + set_bit(PF_USEDFPU, ¤t->flags); /* so we fnsave on switch_to() */ } - if ( current->flags & PF_GUEST_STTS ) + if ( test_and_clear_bit(PF_GUEST_STTS, ¤t->flags) ) { struct guest_trap_bounce *gtb = guest_trap_bounce+smp_processor_id(); gtb->flags = GTBF_TRAP_NOCODE; gtb->cs = current->thread.traps[7].cs; gtb->eip = current->thread.traps[7].address; - current->flags &= ~PF_GUEST_STTS; } } @@ -802,7 +801,7 @@ long do_set_fast_trap(int idx) long do_fpu_taskswitch(void) { - current->flags |= PF_GUEST_STTS; + set_bit(PF_GUEST_STTS, ¤t->flags); stts(); return 0; } diff --git a/xen/common/block.c b/xen/common/block.c deleted file mode 100644 index 851b3b544c..0000000000 --- a/xen/common/block.c +++ /dev/null @@ -1,22 +0,0 @@ -/* block.c - * - * ring data structures for buffering messages between hypervisor and - * guestos's. - * - */ - -#include -#include - -/* - * create_block_ring - * - * domain: - * - * allocates space for a particular domain's block io ring. - */ -blk_ring_t *create_block_ring(int domain) -{ - printk ("XEN create block ring "); - return (blk_ring_t *)NULL; -} diff --git a/xen/common/debug-linux.c b/xen/common/debug-linux.c index 5c178a4a7d..c65e588771 100644 --- a/xen/common/debug-linux.c +++ b/xen/common/debug-linux.c @@ -32,11 +32,13 @@ /* adapted from asm-xeno/page.h */ -static inline unsigned long machine_to_phys(int domain, unsigned long machine) +static inline unsigned long machine_to_phys(domid_t domain, + unsigned long machine) { unsigned long phys; pdb_get_values(domain, (u_char *) &phys, - (unsigned long) machine_to_phys_mapping + (machine >> PAGE_SHIFT) * 4, + (unsigned long) machine_to_phys_mapping + + (machine >> PAGE_SHIFT) * 4, sizeof(phys)); phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK); return phys; @@ -61,7 +63,7 @@ static inline unsigned long machine_to_phys(int domain, unsigned long machine) */ /* read a byte from a process */ -u_char pdb_linux_get_value (int domain, int pid, unsigned long addr) +u_char pdb_linux_get_value(domid_t domain, int pid, unsigned long addr) { u_char result = 0; unsigned long task_struct_p, mm_p, pgd, task_struct_pid; @@ -90,7 +92,7 @@ u_char pdb_linux_get_value (int domain, int pid, unsigned long addr) if (task_struct_p == (unsigned long)NULL) { /* oops */ - printk ("error: couldn't find process 0x%x in domain %d\n", pid, domain); + printk ("error: couldn't find process 0x%x in domain %llu\n", pid, domain); return 0; } diff --git a/xen/common/debug.c b/xen/common/debug.c index 3642c4c8d5..dff739d99a 100644 --- a/xen/common/debug.c +++ b/xen/common/debug.c @@ -23,9 +23,10 @@ /****************************************************************************/ -extern int pdb_change_values (int domain, u_char *buffer, unsigned long addr, - int length, int rw); -extern u_char pdb_linux_get_value (int domain, int pid, unsigned long addr); +extern int pdb_change_values(domid_t domain, + u_char *buffer, unsigned long addr, + int length, int rw); +extern u_char pdb_linux_get_value(domid_t domain, int pid, unsigned long addr); /* * Set memory in a domain's address space @@ -35,7 +36,8 @@ extern u_char pdb_linux_get_value (int domain, int pid, unsigned long addr); * THIS WILL BECOME A MACRO */ -int pdb_set_values (int domain, u_char *buffer, unsigned long addr, int length) +int pdb_set_values(domid_t domain, + u_char *buffer, unsigned long addr, int length) { int count = pdb_change_values(domain, buffer, addr, length, 2); @@ -63,7 +65,8 @@ int pdb_set_values (int domain, u_char *buffer, unsigned long addr, int length) * THIS WILL BECOME A MACRO */ -int pdb_get_values (int domain, u_char *buffer, unsigned long addr, int length) +int pdb_get_values(domid_t domain, + u_char *buffer, unsigned long addr, int length) { return pdb_change_values(domain, buffer, addr, length, 1); } @@ -75,8 +78,8 @@ int pdb_get_values (int domain, u_char *buffer, unsigned long addr, int length) * RW: 1 = read, 2 = write */ -int pdb_change_values (int domain, u_char *buffer, unsigned long addr, - int length, int rw) +int pdb_change_values(domid_t domain, u_char *buffer, unsigned long addr, + int length, int rw) { struct task_struct *p; l2_pgentry_t* l2_table = NULL; @@ -166,7 +169,7 @@ void pdb_do_debug (dom0_op_t *op) { op->u.debug.status = 0; - TRC(printk("PDB: op:%c, dom:%x, in1:%x, in2:%x, in3:%x, in4:%x\n", + TRC(printk("PDB: op:%c, dom:%llu, in1:%x, in2:%x, in3:%x, in4:%x\n", op->u.debug.opcode, op->u.debug.domain, op->u.debug.in1, op->u.debug.in2, op->u.debug.in3, op->u.debug.in4)); @@ -186,7 +189,7 @@ void pdb_do_debug (dom0_op_t *op) struct task_struct * p = find_domain_by_id(op->u.debug.domain); if ( p != NULL ) { - if ( (p->flags & PF_CONSTRUCTED) != 0 ) + if ( test_bit(PF_CONSTRUCTED, &p->flags) ) { wake_up(p); reschedule(p); diff --git a/xen/common/dom0_ops.c b/xen/common/dom0_ops.c index 1d55ade1a5..79f4ecc285 100644 --- a/xen/common/dom0_ops.c +++ b/xen/common/dom0_ops.c @@ -22,21 +22,10 @@ extern unsigned int alloc_new_dom_mem(struct task_struct *, unsigned int); /* Basically used to protect the domain-id space. */ static spinlock_t create_dom_lock = SPIN_LOCK_UNLOCKED; -static unsigned int get_domnr(void) +static domid_t get_domnr(void) { - static unsigned int domnr = 0; - struct task_struct *p; - int tries = 0; - - for ( tries = 0; tries < 1024; tries++ ) - { - domnr = (domnr+1) & ((1<<20)-1); - if ( (p = find_domain_by_id(domnr)) == NULL ) - return domnr; - put_task_struct(p); - } - - return 0; + static domid_t domnr = 0; + return ++domnr; } static int msr_cpu_mask; @@ -101,7 +90,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op) ret = -EINVAL; if ( p != NULL ) { - if ( (p->flags & PF_CONSTRUCTED) != 0 ) + if ( test_bit(PF_CONSTRUCTED, &p->flags) ) { wake_up(p); reschedule(p); @@ -122,7 +111,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op) { struct task_struct *p; static unsigned int pro = 0; - unsigned int dom; + domid_t dom; ret = -ENOMEM; spin_lock_irq(&create_dom_lock); @@ -137,8 +126,8 @@ long do_dom0_op(dom0_op_t *u_dom0_op) if ( op->u.createdomain.name[0] ) { - strncpy (p->name, op->u.createdomain.name, MAX_DOMAIN_NAME); - p->name[MAX_DOMAIN_NAME - 1] = 0; + strncpy(p->name, op->u.createdomain.name, MAX_DOMAIN_NAME); + p->name[MAX_DOMAIN_NAME - 1] = '\0'; } ret = alloc_new_dom_mem(p, op->u.createdomain.memory_kb); @@ -148,9 +137,9 @@ long do_dom0_op(dom0_op_t *u_dom0_op) goto exit_create; } - ret = p->domain; + ret = 0; - op->u.createdomain.domain = ret; + op->u.createdomain.domain = p->domain; copy_to_user(u_dom0_op, op, sizeof(*op)); exit_create: @@ -160,7 +149,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op) case DOM0_DESTROYDOMAIN: { - unsigned int dom = op->u.destroydomain.domain; + domid_t dom = op->u.destroydomain.domain; int force = op->u.destroydomain.force; ret = (dom == IDLE_DOMAIN_ID) ? -EPERM : kill_other_domain(dom, force); } @@ -214,7 +203,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op) case DOM0_ADJUSTDOM: { - unsigned int dom = op->u.adjustdom.domain; + domid_t dom = op->u.adjustdom.domain; unsigned long mcu_adv = op->u.adjustdom.mcu_adv; unsigned long warp = op->u.adjustdom.warp; unsigned long warpl = op->u.adjustdom.warpl; @@ -303,7 +292,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op) memcpy(&op->u.getdomaininfo.ctxt.i386_ctxt, &p->shared_info->execution_context, sizeof(p->shared_info->execution_context)); - if ( p->flags & PF_DONEFPUINIT ) + if ( test_bit(PF_DONEFPUINIT, &p->flags) ) op->u.getdomaininfo.ctxt.flags |= ECF_I387_VALID; memcpy(&op->u.getdomaininfo.ctxt.i387_ctxt, &p->thread.i387, @@ -354,7 +343,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op) { struct pfn_info *page; unsigned long pfn = op->u.getpageframeinfo.pfn; - unsigned int dom = op->u.getpageframeinfo.domain; + domid_t dom = op->u.getpageframeinfo.domain; struct task_struct *p; ret = -EINVAL; @@ -395,7 +384,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op) case DOM0_IOPL: { - extern long do_iopl(unsigned int, unsigned int); + extern long do_iopl(domid_t, unsigned int); ret = do_iopl(op->u.iopl.domain, op->u.iopl.iopl); } break; diff --git a/xen/common/domain.c b/xen/common/domain.c index 139ff3742d..4f45a88b91 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -31,9 +31,10 @@ rwlock_t tasklist_lock __cacheline_aligned = RW_LOCK_UNLOCKED; struct task_struct *task_hash[TASK_HASH_SIZE]; -struct task_struct *do_createdomain(unsigned int dom_id, unsigned int cpu) +struct task_struct *do_createdomain(domid_t dom_id, unsigned int cpu) { int retval; + char buf[100]; struct task_struct *p = NULL; unsigned long flags; @@ -47,7 +48,10 @@ struct task_struct *do_createdomain(unsigned int dom_id, unsigned int cpu) p->domain = dom_id; p->processor = cpu; - sprintf(p->name, "Domain-%d", dom_id); + /* We use a large intermediate to avoid overflow in sprintf. */ + sprintf(buf, "Domain-%llu", dom_id); + strncpy(p->name, buf, MAX_DOMAIN_NAME); + p->name[MAX_DOMAIN_NAME-1] = '\0'; spin_lock_init(&p->blk_ring_lock); spin_lock_init(&p->event_channel_lock); @@ -79,7 +83,7 @@ struct task_struct *do_createdomain(unsigned int dom_id, unsigned int cpu) } -struct task_struct *find_domain_by_id(unsigned int dom) +struct task_struct *find_domain_by_id(domid_t dom) { struct task_struct *p; unsigned long flags; @@ -103,8 +107,7 @@ struct task_struct *find_domain_by_id(unsigned int dom) void kill_domain_with_errmsg(const char *err) { - printk("DOM%d FATAL ERROR: %s\n", - current->domain, err); + printk("DOM%llu FATAL ERROR: %s\n", current->domain, err); kill_domain(); } @@ -126,7 +129,7 @@ void __kill_domain(struct task_struct *p) if ( !sched_rem_domain(p) ) return; - printk("Killing domain %d\n", p->domain); + printk("Killing domain %llu\n", p->domain); unlink_blkdev_info(p); @@ -162,7 +165,7 @@ void kill_domain(void) } -long kill_other_domain(unsigned int dom, int force) +long kill_other_domain(domid_t dom, int force) { struct task_struct *p; unsigned long cpu_mask = 0; @@ -200,7 +203,7 @@ void stop_domain(void) __enter_scheduler(); } -long stop_other_domain(unsigned int dom) +long stop_other_domain(domid_t dom) { unsigned long cpu_mask; struct task_struct *p; @@ -208,7 +211,7 @@ long stop_other_domain(unsigned int dom) if ( dom == 0 ) return -EINVAL; - p = find_domain_by_id (dom); + p = find_domain_by_id(dom); if ( p == NULL) return -ESRCH; if ( p->state != TASK_STOPPED ) @@ -452,7 +455,7 @@ void release_task(struct task_struct *p) ASSERT(p->state == TASK_DYING); ASSERT(!p->has_cpu); - printk("Releasing task %d\n", p->domain); + printk("Releasing task %llu\n", p->domain); /* * This frees up blkdev rings and vbd-access lists. Totally safe since @@ -480,12 +483,12 @@ int final_setup_guestos(struct task_struct *p, dom0_builddomain_t *builddomain) unsigned long phys_l2tab; int i; - if ( (p->flags & PF_CONSTRUCTED) ) + if ( test_bit(PF_CONSTRUCTED, &p->flags) ) return -EINVAL; - p->flags &= ~PF_DONEFPUINIT; + clear_bit(PF_DONEFPUINIT, &p->flags); if ( builddomain->ctxt.flags & ECF_I387_VALID ) - p->flags |= PF_DONEFPUINIT; + set_bit(PF_DONEFPUINIT, &p->flags); memcpy(&p->shared_info->execution_context, &builddomain->ctxt.i386_ctxt, sizeof(p->shared_info->execution_context)); @@ -526,7 +529,7 @@ int final_setup_guestos(struct task_struct *p, dom0_builddomain_t *builddomain) while ( builddomain->num_vifs-- > 0 ) (void)create_net_vif(p->domain); - p->flags |= PF_CONSTRUCTED; + set_bit(PF_CONSTRUCTED, &p->flags); return 0; } @@ -553,7 +556,8 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params, { struct list_head *list_ent; char *src, *vsrc, *dst, *data_start; - int i, dom = p->domain; + int i; + domid_t dom = p->domain; unsigned long phys_l1tab, phys_l2tab; unsigned long cur_address, alloc_address; unsigned long virt_load_address, virt_stack_address; @@ -571,7 +575,7 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params, /* Sanity! */ if ( p->domain != 0 ) BUG(); - if ( (p->flags & PF_CONSTRUCTED) ) BUG(); + if ( test_bit(PF_CONSTRUCTED, &p->flags) ) BUG(); /* * This is all a bit grim. We've moved the modules to the "safe" physical @@ -589,21 +593,21 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params, if ( strncmp(data_start, "XenoGues", 8) ) { - printk("DOM%d: Invalid guest OS image\n", dom); + printk("DOM%llu: Invalid guest OS image\n", dom); return -1; } virt_load_address = *(unsigned long *)(data_start + 8); if ( (virt_load_address & (PAGE_SIZE-1)) ) { - printk("DOM%d: Guest OS load address not page-aligned (%08lx)\n", + printk("DOM%llu: Guest OS load address not page-aligned (%08lx)\n", dom, virt_load_address); return -1; } if ( alloc_new_dom_mem(p, params->memory_kb) ) { - printk("DOM%d: Not enough memory --- reduce dom0_mem ??\n", dom); + printk("DOM%llu: Not enough memory --- reduce dom0_mem ??\n", dom); return -ENOMEM; } @@ -614,7 +618,7 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params, if ( data_len > (params->memory_kb << 9) ) { - printk("DOM%d: Guest OS image is too large\n" + printk("DOM%llu: Guest OS image is too large\n" " (%luMB is greater than %uMB limit for a\n" " %uMB address space)\n", dom, data_len>>20, @@ -624,7 +628,7 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params, return -1; } - printk("DOM%d: Guest OS virtual load address is %08lx\n", dom, + printk("DOM%llu: Guest OS virtual load address is %08lx\n", dom, virt_load_address); SET_GDT_ENTRIES(p, DEFAULT_GDT_ENTRIES); @@ -753,14 +757,11 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params, virt_startinfo_address->pt_base = virt_load_address + ((p->tot_pages - 1) << PAGE_SHIFT); - virt_startinfo_address->dom_id = p->domain; virt_startinfo_address->flags = 0; if ( IS_PRIV(p) ) - { virt_startinfo_address->flags |= SIF_PRIVILEGED; - if ( CONSOLE_ISOWNER(p) ) - virt_startinfo_address->flags |= SIF_CONSOLE; - } + if ( p->domain == 0 ) + virt_startinfo_address->flags |= SIF_INITDOMAIN; if ( initrd_len ) { @@ -787,12 +788,8 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params, *dst = '\0'; /* If this guy's getting the console we'd better let go. */ - if ( virt_startinfo_address->flags & SIF_CONSOLE ) - { - /* NB. Should reset the console here. */ + if ( CONSOLE_ISOWNER(p) ) opt_console = 0; - } - /* Reinstate the caller's page tables. */ write_cr3_counted(pagetable_val(current->mm.pagetable)); @@ -819,7 +816,7 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params, } kfree(xd); - p->flags |= PF_CONSTRUCTED; + set_bit(PF_CONSTRUCTED, &p->flags); new_thread(p, (unsigned long)virt_load_address, diff --git a/xen/common/kernel.c b/xen/common/kernel.c index 86138c59e6..3554ec5b17 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -222,6 +222,8 @@ void cmain (unsigned long magic, multiboot_info_t *mbi) new_dom = do_createdomain(0, 0); if ( new_dom == NULL ) panic("Error creating domain 0\n"); + set_bit(PF_PRIVILEGED, &new_dom->flags); + /* * We're going to setup domain0 using the module(s) that we stashed safely * above our MAX_DIRECTMAP_ADDRESS in boot/Boot.S The second module, if @@ -620,7 +622,7 @@ int console_export(char *str, int len) unmap_domain_mem(skb_data); - skb->dst_vif = find_vif_by_id(0); + skb->dst_vif = find_net_vif(0, 0); (void)netif_rx(skb); return 1; @@ -655,7 +657,7 @@ long do_console_write(char *str, unsigned int count) spin_lock_irqsave(&console_lock, flags); __putstr("DOM"); - sprintf(dom_id, "%d", current->domain); + sprintf(dom_id, "%llu", current->domain); __putstr(dom_id); __putstr(": "); diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c index 3c92eb976f..ec0eee2af6 100644 --- a/xen/common/keyhandler.c +++ b/xen/common/keyhandler.c @@ -107,7 +107,7 @@ void do_task_queues(u_char key, void *dev_id, struct pt_regs *regs) p = &idle0_task; do { - printk("Xen: DOM %d, CPU %d [has=%c], state = %s, " + printk("Xen: DOM %llu, CPU %d [has=%c], state = %s, " "hyp_events = %08x\n", p->domain, p->processor, p->has_cpu ? 'T':'F', task_states[p->state], p->hyp_events); diff --git a/xen/common/network.c b/xen/common/network.c index 14bfa8dac5..9514745d45 100644 --- a/xen/common/network.c +++ b/xen/common/network.c @@ -1,4 +1,5 @@ -/* network.c +/****************************************************************************** + * network.c * * Network virtualization for Xen. Lower-level network interactions are in * net/dev.c and in the drivers. This file contains routines to interact @@ -6,6 +7,20 @@ * the use of rules. * * Copyright (c) 2002-2003, A K Warfield and K A Fraser + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include @@ -32,11 +47,11 @@ void print_net_rule_list(); /* ----[ VIF Functions ]----------------------------------------------------*/ -net_vif_t *find_vif_by_id(unsigned long id) +net_vif_t *find_net_vif(domid_t dom, unsigned int idx) { struct task_struct *p; net_vif_t *vif = NULL; - unsigned long flags, dom = id>>VIF_DOMAIN_SHIFT; + unsigned long flags; read_lock_irqsave(&tasklist_lock, flags); p = task_hash[TASK_HASH(dom)]; @@ -44,8 +59,9 @@ net_vif_t *find_vif_by_id(unsigned long id) { if ( p->domain == dom ) { - vif = p->net_vif_list[id&VIF_INDEX_MASK]; - if ( vif != NULL ) get_vif(vif); + vif = p->net_vif_list[idx]; + if ( vif != NULL ) + get_vif(vif); break; } p = p->next_hash; @@ -56,30 +72,32 @@ net_vif_t *find_vif_by_id(unsigned long id) } -/* create_net_vif - Create a new vif and append it to the specified domain. +/* + * create_net_vif - Create a new vif and append it to the specified domain. * - * the domain is examined to determine how many vifs currently are allocated + * The domain is examined to determine how many vifs currently are allocated * and the newly allocated vif is appended. The vif is also added to the * global list. * */ -net_vif_t *create_net_vif(int domain) +net_vif_t *create_net_vif(domid_t dom) { - int dom_vif_idx; + unsigned int idx; net_vif_t *new_vif = NULL; net_ring_t *new_ring = NULL; struct task_struct *p = NULL; unsigned long flags, vmac_hash; unsigned char vmac_key[ETH_ALEN + 2 + MAX_DOMAIN_NAME]; - if ( !(p = find_domain_by_id(domain)) ) + if ( (p = find_domain_by_id(dom)) == NULL ) return NULL; write_lock_irqsave(&tasklist_lock, flags); - for ( dom_vif_idx = 0; dom_vif_idx < MAX_DOMAIN_VIFS; dom_vif_idx++ ) - if ( p->net_vif_list[dom_vif_idx] == NULL ) break; - if ( dom_vif_idx == MAX_DOMAIN_VIFS ) + for ( idx = 0; idx < MAX_DOMAIN_VIFS; idx++ ) + if ( p->net_vif_list[idx] == NULL ) + break; + if ( idx == MAX_DOMAIN_VIFS ) goto fail; if ( (new_vif = kmem_cache_alloc(net_vif_cache, GFP_KERNEL)) == NULL ) @@ -87,7 +105,8 @@ net_vif_t *create_net_vif(int domain) memset(new_vif, 0, sizeof(*new_vif)); - if ( sizeof(net_ring_t) > PAGE_SIZE ) BUG(); + if ( sizeof(net_ring_t) > PAGE_SIZE ) + BUG(); new_ring = (net_ring_t *)get_free_page(GFP_KERNEL); clear_page(new_ring); SHARE_PFN_WITH_DOMAIN(virt_to_page(new_ring), p); @@ -98,9 +117,9 @@ net_vif_t *create_net_vif(int domain) */ atomic_set(&new_vif->refcnt, 1); new_vif->shared_rings = new_ring; - new_vif->shared_idxs = &p->shared_info->net_idx[dom_vif_idx]; + new_vif->shared_idxs = &p->shared_info->net_idx[idx]; new_vif->domain = p; - new_vif->idx = dom_vif_idx; + new_vif->idx = idx; new_vif->list.next = NULL; spin_lock_init(&new_vif->rx_lock); spin_lock_init(&new_vif->tx_lock); @@ -109,7 +128,7 @@ net_vif_t *create_net_vif(int domain) new_vif->credit_usec = 0UL; init_ac_timer(&new_vif->credit_timeout); - if ( (p->domain == 0) && (dom_vif_idx == 0) ) + if ( (p->domain == 0) && (idx == 0) ) { /* * DOM0/VIF0 gets the real physical MAC address, so that users can @@ -134,7 +153,7 @@ net_vif_t *create_net_vif(int domain) * MAC addresses for some VIFs with no fear of clashes. */ memcpy(&vmac_key[0], the_dev->dev_addr, ETH_ALEN); - *(__u16 *)(&vmac_key[ETH_ALEN]) = htons(dom_vif_idx); + *(__u16 *)(&vmac_key[ETH_ALEN]) = htons(idx); strcpy(&vmac_key[ETH_ALEN+2], p->name); vmac_hash = hash(vmac_key, ETH_ALEN + 2 + strlen(p->name)); memcpy(new_vif->vmac, "\xaa\x00\x00", 3); @@ -143,7 +162,7 @@ net_vif_t *create_net_vif(int domain) new_vif->vmac[5] = (vmac_hash >> 0) & 0xff; } - p->net_vif_list[dom_vif_idx] = new_vif; + p->net_vif_list[idx] = new_vif; write_unlock_irqrestore(&tasklist_lock, flags); return new_vif; @@ -182,9 +201,6 @@ void unlink_net_vif(net_vif_t *vif) } -/* vif_query - Call from the proc file system to get a list of indexes - * in use by a particular domain. - */ int vif_query(vif_query_t *vq) { net_vif_t *vif; @@ -193,7 +209,8 @@ int vif_query(vif_query_t *vq) int i; int count = 0; - if ( !(p = find_domain_by_id(vq->domain)) ) { + if ( (p = find_domain_by_id(vq->domain)) == NULL ) + { buf[0] = -1; copy_to_user(vq->buf, buf, sizeof(int)); return -ESRCH; @@ -215,15 +232,11 @@ int vif_query(vif_query_t *vq) return 0; } -/* vif_getinfo - Call from the proc file system to get info about a specific - * vif in use by a particular domain. - */ int vif_getinfo(vif_getinfo_t *info) { net_vif_t *vif; - vif = find_vif_by_id((info->domain << VIF_DOMAIN_SHIFT) | info->vif); - if ( vif == NULL ) + if ( (vif = find_net_vif(info->domain, info->vif)) == NULL ) return -ESRCH; info->total_bytes_sent = vif->total_bytes_sent; @@ -244,8 +257,7 @@ int vif_setparams(vif_setparams_t *params) { net_vif_t *vif; - vif = find_vif_by_id((params->domain << VIF_DOMAIN_SHIFT) | params->vif); - if ( vif == NULL ) + if ( (vif = find_net_vif(params->domain, params->vif)) == NULL ) return -ESRCH; /* Turning off rate limiting? */ @@ -263,9 +275,6 @@ int vif_setparams(vif_setparams_t *params) /* ----[ Net Rule Functions ]-----------------------------------------------*/ -/* add_net_rule - Add a new network filter rule. - */ - int add_net_rule(net_rule_t *rule) { net_rule_ent_t *new_ent; @@ -283,83 +292,72 @@ int add_net_rule(net_rule_t *rule) return 0; } -/* delete_net_rule - Delete an existing network rule. - */ - int delete_net_rule(net_rule_t *rule) { - net_rule_ent_t *ent = net_rule_list, *prev = NULL; - while ( (ent) && ((memcmp(rule, &ent->r, sizeof(net_rule_t))) != 0) ) - { - prev = ent; - ent = ent->next; - } + net_rule_ent_t **pent, *ent; + + write_lock(&net_rule_lock); - if (ent != NULL) + for ( pent = &net_rule_list; pent != NULL; pent = &ent->next ) { - write_lock(&net_rule_lock); - if (prev != NULL) + ent = *pent; + if ( memcmp(rule, &ent->r, sizeof(net_rule_t)) == 0 ) { - prev->next = ent->next; - } - else - { - net_rule_list = ent->next; + *pent = ent->next; + kmem_cache_free(net_rule_cache, ent); + break; } - kmem_cache_free(net_rule_cache, ent); - write_unlock(&net_rule_lock); } + + write_unlock(&net_rule_lock); return 0; } -/* print_net_rule - Print a single net rule. - */ +static char *idx_to_name(unsigned int idx) +{ + if ( idx == VIF_PHYSICAL_INTERFACE ) + return "PHYSICAL"; + if ( idx == VIF_ANY_INTERFACE ) + return "ANY"; + return "UNKNOWN"; +} + +static char *print_ip_addr(char *buf, unsigned long addr) +{ + sprintf(buf, "%lu.%lu.%lu.%lu", + (addr>>24)&255, (addr>>16)&255, (addr>>8)&255, addr&255); + return buf; +} void print_net_rule(net_rule_t *r) { + char buf[20]; + printk("===] NET RULE:\n"); - printk("=] src_addr : %lu\n", (unsigned long) r->src_addr); - printk("=] src_addr_mask : %lu\n", (unsigned long) r->src_addr_mask); - printk("=] dst_addr : %lu\n", (unsigned long) r->dst_addr); - printk("=] dst_addr_mask : %lu\n", (unsigned long) r->dst_addr_mask); + printk("=] src_addr : %s\n", print_ip_addr(buf, r->src_addr)); + printk("=] src_addr_mask : %s\n", print_ip_addr(buf, r->src_addr_mask)); + printk("=] dst_addr : %s\n", print_ip_addr(buf, r->dst_addr)); + printk("=] dst_addr_mask : %s\n", print_ip_addr(buf, r->dst_addr_mask)); printk("=] src_port : %u\n", r->src_port); printk("=] src_port_mask : %u\n", r->src_port_mask); printk("=] dst_port : %u\n", r->dst_port); printk("=] dst_port_mask : %u\n", r->dst_port_mask); printk("=] dst_proto : %u\n", r->proto); - switch ( r->src_vif ) - { - case VIF_PHYSICAL_INTERFACE: - printk("=] src_dom/idx : PHYSICAL\n"); - break; - case VIF_ANY_INTERFACE: - printk("=] src_dom/idx : ANY\n"); - break; - default: - printk("=] src_dom/idx : %lu/%lu\n", - r->src_vif>>VIF_DOMAIN_SHIFT, r->src_vif&VIF_INDEX_MASK); - break; - } - switch ( r->dst_vif ) - { - case VIF_PHYSICAL_INTERFACE: - printk("=] dst_dom/idx : PHYSICAL\n"); - break; - case VIF_ANY_INTERFACE: - printk("=] dst_dom/idx : ANY\n"); - break; - default: - printk("=] dst_dom/idx : %lu/%lu\n", - r->dst_vif>>VIF_DOMAIN_SHIFT, r->dst_vif&VIF_INDEX_MASK); - break; - } + + if ( r->src_dom == VIF_SPECIAL ) + printk("=] src_dom/idx : %s\n", idx_to_name(r->src_idx)); + else + printk("=] src_dom/idx : %llu/%u\n", r->src_dom, r->src_idx); + + if ( r->dst_dom == VIF_SPECIAL ) + printk("=] dst_dom/idx : %s\n", idx_to_name(r->dst_idx)); + else + printk("=] dst_dom/idx : %llu/%u\n", r->dst_dom, r->dst_idx); + printk("=] action : %u\n", r->action); } -/* print_net_rule_list - Print the global rule table. - */ - -void print_net_rule_list() +void print_net_rule_list(void) { net_rule_ent_t *ent; int count = 0; @@ -368,17 +366,19 @@ void print_net_rule_list() ent = net_rule_list; - while (ent) + while ( ent != NULL ) { print_net_rule(&ent->r); ent = ent->next; count++; } + printk("\nTotal of %d rules.\n", count); read_unlock(&net_rule_lock); } + /* net_find_rule - Find the destination vif according to the current rules. * * Apply the rules to this skbuff and return the vif id that it is bound for. @@ -386,10 +386,12 @@ void print_net_rule_list() */ static net_vif_t *net_find_rule(u8 nproto, u8 tproto, u32 src_addr, u32 dst_addr, u16 src_port, - u16 dst_port, unsigned long src_vif) + u16 dst_port, + domid_t src_dom, unsigned int src_idx) { net_rule_ent_t *ent; - unsigned long dest = VIF_UNKNOWN_INTERFACE; + domid_t dst_dom = VIF_SPECIAL; + unsigned int dst_idx = VIF_UNKNOWN_INTERFACE; read_lock(&net_rule_lock); @@ -397,10 +399,13 @@ static net_vif_t *net_find_rule(u8 nproto, u8 tproto, u32 src_addr, while ( ent != NULL ) { - if ( ((ent->r.src_vif == src_vif) - || (ent->r.src_vif == VIF_ANY_INTERFACE)) && + if ( (((ent->r.src_dom == src_dom) && + (ent->r.src_idx == src_idx)) || + ((ent->r.src_dom == VIF_SPECIAL) && + (ent->r.src_idx == VIF_ANY_INTERFACE))) && - (src_vif != ent->r.dst_vif) && + ((src_dom != ent->r.dst_dom) || + (src_idx != ent->r.dst_idx)) && (!((ent->r.src_addr ^ src_addr) & ent->r.src_addr_mask )) && (!((ent->r.dst_addr ^ dst_addr) & ent->r.dst_addr_mask )) && @@ -418,14 +423,14 @@ static net_vif_t *net_find_rule(u8 nproto, u8 tproto, u32 src_addr, (tproto == IPPROTO_UDP))) ) { + dst_dom = ent->r.dst_dom; + dst_idx = ent->r.dst_idx; /* * XXX FFS! We keep going to find the "best" rule. Where best * corresponds to vaguely sane routing of a packet. We need a less * shafted model for our "virtual firewall/router" methinks! */ - if ( (dest & VIF_DOMAIN_MASK) == VIF_SPECIAL ) - dest = ent->r.dst_vif; - if ( (dest & VIF_DOMAIN_MASK) != VIF_SPECIAL ) + if ( dst_dom != VIF_SPECIAL ) break; } ent = ent->next; @@ -433,12 +438,14 @@ static net_vif_t *net_find_rule(u8 nproto, u8 tproto, u32 src_addr, read_unlock(&net_rule_lock); - if ( dest == VIF_PHYSICAL_INTERFACE ) - return VIF_PHYS; - else if ( (dest & VIF_DOMAIN_MASK) == VIF_SPECIAL ) + if ( dst_dom == VIF_SPECIAL ) + { + if ( dst_idx == VIF_PHYSICAL_INTERFACE ) + return VIF_PHYS; return VIF_DROP; - else - return find_vif_by_id(dest); + } + + return find_net_vif(dst_dom, dst_idx); } /* net_get_target_vif - Find the vif that the given sk_buff is bound for. @@ -463,13 +470,17 @@ net_vif_t *net_get_target_vif(u8 *data, unsigned int len, net_vif_t *src_vif) { net_vif_t *target = VIF_DROP; u8 *h_raw, *nh_raw; - unsigned long src_vif_val = VIF_PHYSICAL_INTERFACE; + domid_t src_dom = VIF_SPECIAL; + unsigned int src_idx = VIF_PHYSICAL_INTERFACE; if ( src_vif != VIF_PHYS ) - src_vif_val = (src_vif->domain->domain<idx; + { + src_dom = src_vif->domain->domain; + src_idx = src_vif->idx; + } - if ( len < ETH_HLEN ) goto drop; + if ( len < ETH_HLEN ) + goto drop; nh_raw = data + ETH_HLEN; switch ( ntohs(*(unsigned short *)(data + 12)) ) @@ -478,7 +489,7 @@ net_vif_t *net_get_target_vif(u8 *data, unsigned int len, net_vif_t *src_vif) if ( len < (ETH_HLEN + 28) ) goto drop; target = net_find_rule((u8)ETH_P_ARP, 0, ntohl(*(u32 *)(nh_raw + 14)), ntohl(*(u32 *)(nh_raw + 24)), 0, 0, - src_vif_val); + src_dom, src_idx); break; case ETH_P_IP: @@ -490,14 +501,14 @@ net_vif_t *net_get_target_vif(u8 *data, unsigned int len, net_vif_t *src_vif) ntohl(*(u32 *)(nh_raw + 16)), 0, 0, - src_vif_val); + src_dom, src_idx); break; } return target; drop: - printk("VIF%lu/%lu: pkt to drop!\n", - src_vif_val>>VIF_DOMAIN_SHIFT, src_vif_val&VIF_INDEX_MASK); + printk("VIF%llu/%u: pkt to drop!\n", + src_dom, src_idx); return VIF_DROP; } diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 5352bbb6a6..122915f145 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -306,7 +306,7 @@ long sched_bvtctl(unsigned long c_allow) } /* Adjust scheduling parameter for a given domain. */ -long sched_adjdom(int dom, unsigned long mcu_adv, unsigned long warp, +long sched_adjdom(domid_t dom, unsigned long mcu_adv, unsigned long warp, unsigned long warpl, unsigned long warpu) { struct task_struct *p; @@ -512,6 +512,7 @@ asmlinkage void __enter_scheduler(void) * 'next_prime's evt. Take context switch allowance into account. */ ASSERT(next_prime->evt >= next->evt); + r_time = ((next_prime->evt - next->evt)/next->mcu_advance) + ctx_allow; sched_done: @@ -697,7 +698,8 @@ static void dump_rqueue(struct list_head *queue, char *name) (unsigned long) queue->next, (unsigned long) queue->prev); list_for_each (list, queue) { p = list_entry(list, struct task_struct, run_list); - printk("%3d: %3d has=%c mcua=0x%04lX ev=0x%08X av=0x%08X c=0x%X%08X\n", + printk("%3d: %llu has=%c mcua=0x%04lX" + " ev=0x%08X av=0x%08X c=0x%X%08X\n", loop++, p->domain, p->has_cpu ? 'T':'F', p->mcu_advance, p->evt, p->avt, diff --git a/xen/drivers/block/xen_block.c b/xen/drivers/block/xen_block.c index 6b993551e5..4f0888a185 100644 --- a/xen/drivers/block/xen_block.c +++ b/xen/drivers/block/xen_block.c @@ -567,7 +567,7 @@ static void dump_blockq(u_char key, void *dev_id, struct pt_regs *regs) do { if ( !is_idle_task(p) ) { - printk("Domain: %d\n", p->domain); + printk("Domain: %llu\n", p->domain); blk_ring = p->blk_ring_base; printk(" req_prod:0x%08x, req_cons:0x%08x resp_prod:0x%08x/" diff --git a/xen/include/asm-i386/i387.h b/xen/include/asm-i386/i387.h index 7ec679d446..5a3f0fd5e6 100644 --- a/xen/include/asm-i386/i387.h +++ b/xen/include/asm-i386/i387.h @@ -19,14 +19,13 @@ extern void save_init_fpu( struct task_struct *tsk ); extern void restore_fpu( struct task_struct *tsk ); #define unlazy_fpu( tsk ) do { \ - if ( tsk->flags & PF_USEDFPU ) \ + if ( test_bit(PF_USEDFPU, &tsk->flags) ) \ save_init_fpu( tsk ); \ } while (0) #define clear_fpu( tsk ) do { \ - if ( tsk->flags & PF_USEDFPU ) { \ + if ( test_and_clear_bit(PF_USEDFPU, &tsk->flags) ) { \ asm volatile("fwait"); \ - tsk->flags &= ~PF_USEDFPU; \ stts(); \ } \ } while (0) diff --git a/xen/include/asm-i386/pdb.h b/xen/include/asm-i386/pdb.h index b1416784fc..fa161f22d0 100644 --- a/xen/include/asm-i386/pdb.h +++ b/xen/include/asm-i386/pdb.h @@ -21,10 +21,10 @@ extern int pdb_high_bit; extern void initialize_pdb(void); /* Get/set values from generic debug interface. */ -extern int pdb_set_values (int domain, u_char *buffer, - unsigned long addr, int length); -extern int pdb_get_values (int domain, u_char *buffer, - unsigned long addr, int length); +extern int pdb_set_values(domid_t domain, u_char *buffer, + unsigned long addr, int length); +extern int pdb_get_values(domid_t domain, u_char *buffer, + unsigned long addr, int length); /* External entry points. */ extern int pdb_handle_exception(int exceptionVector, diff --git a/xen/include/hypervisor-ifs/block.h b/xen/include/hypervisor-ifs/block.h index 0f0e32f665..515d8ad338 100644 --- a/xen/include/hypervisor-ifs/block.h +++ b/xen/include/hypervisor-ifs/block.h @@ -98,7 +98,7 @@ typedef struct xen_disk unsigned short device; /* device number (opaque 16 bit val) */ unsigned short info; /* device type and flags */ unsigned long capacity; /* size in terms of #512 byte sectors */ - unsigned int domain; /* if a VBD, domain this 'belongs to' */ + domid_t domain; /* if a VBD, domain this 'belongs to' */ } xen_disk_t; typedef struct xen_disk_info diff --git a/xen/include/hypervisor-ifs/dom0_ops.h b/xen/include/hypervisor-ifs/dom0_ops.h index e260c1c033..4562aa1c49 100644 --- a/xen/include/hypervisor-ifs/dom0_ops.h +++ b/xen/include/hypervisor-ifs/dom0_ops.h @@ -17,7 +17,7 @@ * This makes sure that old versions of dom0 tools will stop working in a * well-defined way (rather than crashing the machine, for instance). */ -#define DOM0_INTERFACE_VERSION 0xAAAA0004 +#define DOM0_INTERFACE_VERSION 0xAAAA0005 /* @@ -51,30 +51,30 @@ typedef struct dom0_createdomain_st { /* IN parameters. */ unsigned int memory_kb; - char name[MAX_DOMAIN_NAME]; + char name[MAX_DOMAIN_NAME]; /* OUT parameters. */ - unsigned int domain; + domid_t domain; } dom0_createdomain_t; #define DOM0_STARTDOMAIN 10 typedef struct dom0_startdomain_st { /* IN parameters. */ - unsigned int domain; + domid_t domain; } dom0_startdomain_t; #define DOM0_STOPDOMAIN 11 typedef struct dom0_stopdomain_st { /* IN parameters. */ - unsigned int domain; + domid_t domain; } dom0_stopdomain_t; #define DOM0_DESTROYDOMAIN 9 typedef struct dom0_destroydomain_st { /* IN variables. */ - unsigned int domain; + domid_t domain; int force; } dom0_destroydomain_t; @@ -82,7 +82,7 @@ typedef struct dom0_destroydomain_st typedef struct dom0_getmemlist_st { /* IN variables. */ - unsigned int domain; + domid_t domain; unsigned long max_pfns; void *buffer; /* OUT variables. */ @@ -93,8 +93,8 @@ typedef struct dom0_getmemlist_st typedef struct dom0_builddomain_st { /* IN variables. */ - unsigned int domain; - unsigned int num_vifs; + domid_t domain; + unsigned int num_vifs; full_execution_context_t ctxt; } dom0_builddomain_t; @@ -109,7 +109,7 @@ typedef struct dom0_bvtctl_st typedef struct dom0_adjustdom_st { /* IN variables. */ - unsigned int domain; /* domain id */ + domid_t domain; /* domain id */ unsigned long mcu_adv; /* mcu advance: inverse of weight */ unsigned long warp; /* time warp */ unsigned long warpl; /* warp limit */ @@ -120,7 +120,7 @@ typedef struct dom0_adjustdom_st typedef struct dom0_getdomaininfo_st { /* IN variables. */ - unsigned int domain; + domid_t domain; /* OUT variables. */ char name[MAX_DOMAIN_NAME]; int processor; @@ -141,7 +141,7 @@ typedef struct dom0_getpageframeinfo_st { /* IN variables. */ unsigned long pfn; /* Machine page frame number to query. */ - unsigned int domain; /* To which domain does the frame belong? */ + domid_t domain; /* To which domain does the frame belong? */ /* OUT variables. */ enum { NONE, L1TAB, L2TAB } type; /* Is the page PINNED to a type? */ } dom0_getpageframeinfo_t; @@ -149,7 +149,7 @@ typedef struct dom0_getpageframeinfo_st #define DOM0_IOPL 14 typedef struct dom0_iopl_st { - unsigned int domain; + domid_t domain; unsigned int iopl; } dom0_iopl_t; @@ -168,7 +168,7 @@ typedef struct dom0_debug_st { /* IN variables. */ char opcode; - unsigned int domain; + domid_t domain; int in1, in2, in3, in4; /* OUT variables. */ unsigned int status; @@ -206,7 +206,7 @@ typedef struct dom0_readconsole_st typedef struct dom0_pincpudomain_st { /* IN variables. */ - unsigned int domain; + domid_t domain; int cpu; /* -1 implies unpin */ } dom0_pincpudomain_t; diff --git a/xen/include/hypervisor-ifs/hypervisor-if.h b/xen/include/hypervisor-ifs/hypervisor-if.h index 4233d56285..e9b9ce49ed 100644 --- a/xen/include/hypervisor-ifs/hypervisor-if.h +++ b/xen/include/hypervisor-ifs/hypervisor-if.h @@ -185,6 +185,10 @@ #ifndef __ASSEMBLY__ +typedef u64 domid_t; +/* DOMID_SELF is used in certain contexts to refer to oneself. */ +#define DOMID_SELF (~1ULL) + #include "network.h" #include "block.h" @@ -334,7 +338,6 @@ typedef struct start_info_st { /* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME. */ unsigned long nr_pages; /* total pages allocated to this domain. */ unsigned long shared_info; /* MACHINE address of shared info struct.*/ - unsigned long dom_id; /* Domain identifier. */ unsigned long flags; /* SIF_xxx flags. */ /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). */ unsigned long pt_base; /* VIRTUAL address of page directory. */ @@ -345,7 +348,7 @@ typedef struct start_info_st { /* These flags are passed in the 'flags' field of start_info_t. */ #define SIF_PRIVILEGED 1 /* Is the domain privileged? */ -#define SIF_CONSOLE 2 /* Does the domain own the physical console? */ +#define SIF_INITDOMAIN 2 /* Is thsi the initial control domain? */ /* For use in guest OSes. */ extern shared_info_t *HYPERVISOR_shared_info; diff --git a/xen/include/hypervisor-ifs/network.h b/xen/include/hypervisor-ifs/network.h index 038b49beca..def5a6ee90 100644 --- a/xen/include/hypervisor-ifs/network.h +++ b/xen/include/hypervisor-ifs/network.h @@ -135,31 +135,26 @@ typedef struct net_rule_st u16 src_port_mask; u16 dst_port_mask; u16 proto; - unsigned long src_vif; - unsigned long dst_vif; + domid_t src_dom, dst_dom; + unsigned int src_idx, dst_idx; u16 action; } net_rule_t; -#define VIF_DOMAIN_MASK 0xfffff000UL -#define VIF_DOMAIN_SHIFT 12 -#define VIF_INDEX_MASK 0x00000fffUL -#define VIF_INDEX_SHIFT 0 - -/* These are specified in the index if the dom is SPECIAL. */ -#define VIF_SPECIAL 0xfffff000UL -#define VIF_UNKNOWN_INTERFACE (VIF_SPECIAL | 0) -#define VIF_PHYSICAL_INTERFACE (VIF_SPECIAL | 1) -#define VIF_ANY_INTERFACE (VIF_SPECIAL | 2) +/* These are specified in the 'idx' if the 'dom' is SPECIAL. */ +#define VIF_SPECIAL (~0ULL) +#define VIF_UNKNOWN_INTERFACE 0 +#define VIF_PHYSICAL_INTERFACE 1 +#define VIF_ANY_INTERFACE 2 typedef struct vif_query_st { - unsigned int domain; + domid_t domain; int *buf; /* reply buffer -- guest virtual address */ } vif_query_t; typedef struct vif_getinfo_st { - unsigned int domain; + domid_t domain; unsigned int vif; /* domain & vif are supplied by dom0, the rest are response fields */ @@ -179,7 +174,7 @@ typedef struct vif_getinfo_st */ typedef struct vif_setparams_st { - unsigned int domain; + domid_t domain; unsigned int vif; unsigned long credit_bytes; unsigned long credit_usec; diff --git a/xen/include/hypervisor-ifs/vbd.h b/xen/include/hypervisor-ifs/vbd.h index df3ecba4ca..a16d1253de 100644 --- a/xen/include/hypervisor-ifs/vbd.h +++ b/xen/include/hypervisor-ifs/vbd.h @@ -32,43 +32,43 @@ typedef struct _xen_extent { typedef struct _vbd_create { - unsigned domain; /* create VBD for this domain */ + domid_t domain; /* create VBD for this domain */ u16 vdevice; /* id by which dom will refer to VBD */ u16 mode; /* OR of { VBD_MODE_R , VBD_MODE_W } */ } vbd_create_t; typedef struct _vbd_grow { - unsigned domain; /* domain in question */ + domid_t domain; /* domain in question */ u16 vdevice; /* 16 bit id domain refers to VBD as */ xen_extent_t extent; /* the extent to add to this VBD */ } vbd_grow_t; typedef struct _vbd_shrink { - unsigned domain; /* domain in question */ + domid_t domain; /* domain in question */ u16 vdevice; /* 16 bit id domain refers to VBD as */ } vbd_shrink_t; typedef struct _vbd_setextents { - unsigned domain; /* domain in question */ + domid_t domain; /* domain in question */ u16 vdevice; /* 16 bit id domain refers to VBD as */ u16 nr_extents; /* number of extents in the list */ xen_extent_t *extents; /* the extents to add to this VBD */ } vbd_setextents_t; typedef struct _vbd_delete { - unsigned domain; /* domain in question */ + domid_t domain; /* domain in question */ u16 vdevice; /* 16 bit id domain refers to VBD as */ } vbd_delete_t; -#define VBD_PROBE_ALL 0xFFFFFFFF +#define VBD_PROBE_ALL (~0ULL) typedef struct _vbd_probe { - unsigned domain; /* domain in question or VBD_PROBE_ALL */ + domid_t domain; /* domain in question or VBD_PROBE_ALL */ xen_disk_info_t xdi; /* where's our space for VBD/disk info */ } vbd_probe_t; typedef struct _vbd_info { /* IN variables */ - unsigned domain; /* domain in question */ + domid_t domain; /* domain in question */ u16 vdevice; /* 16 bit id domain refers to VBD as */ u16 maxextents; /* max # of extents to return info for */ xen_extent_t *extents; /* pointer to space for extent list */ diff --git a/xen/include/xeno/sched.h b/xen/include/xeno/sched.h index b6f7c40268..e77d4a5ebc 100644 --- a/xen/include/xeno/sched.h +++ b/xen/include/xeno/sched.h @@ -33,19 +33,17 @@ extern struct mm_struct init_mm; #define _HYP_EVENT_NEED_RESCHED 0 #define _HYP_EVENT_DIE 1 -#define PF_DONEFPUINIT 0x1 /* Has the FPU been initialised for this task? */ -#define PF_USEDFPU 0x2 /* Has this task used the FPU since last save? */ -#define PF_GUEST_STTS 0x4 /* Has the guest OS requested 'stts'? */ -#define PF_CONSTRUCTED 0x8 /* Has the guest OS been fully built yet? */ +#define PF_DONEFPUINIT 0 /* Has the FPU been initialised for this task? */ +#define PF_USEDFPU 1 /* Has this task used the FPU since last save? */ +#define PF_GUEST_STTS 2 /* Has the guest OS requested 'stts'? */ +#define PF_CONSTRUCTED 3 /* Has the guest OS been fully built yet? */ +#define PF_IDLETASK 4 /* Is this one of the per-CPU idle domains? */ +#define PF_PRIVILEGED 5 /* Is this domain privileged? */ #include #include -/* SMH: replace below when have explicit 'priv' flag or bitmask */ -#define IS_PRIV(_p) ((_p)->domain == 0) - -#define DOMAIN_ID_BITS (16) -#define MAX_DOMAIN_ID ((1<<(DOMAIN_ID_BITS))-1) +#define IS_PRIV(_p) (test_bit(PF_PRIVILEGED, &(_p)->flags)) typedef struct event_channel_st { @@ -92,8 +90,8 @@ struct task_struct /* * From here on things can be added and shuffled without special attention */ - - unsigned int domain; /* domain id */ + + domid_t domain; spinlock_t page_list_lock; struct list_head page_list; @@ -185,14 +183,15 @@ struct task_struct addr_limit: KERNEL_DS, \ thread: INIT_THREAD, \ prev_task: &(_t), \ - next_task: &(_t) \ + next_task: &(_t), \ + flags: 1<domain == IDLE_DOMAIN_ID) +#define IDLE_DOMAIN_ID (~0ULL) +#define is_idle_task(_p) (test_bit(PF_IDLETASK, &(_p)->flags)) #include @@ -205,21 +204,21 @@ extern kmem_cache_t *task_struct_cachep; atomic_inc(&(_p)->refcnt) extern struct task_struct *do_createdomain( - unsigned int dom_id, unsigned int cpu); + domid_t dom_id, unsigned int cpu); extern int setup_guestos( struct task_struct *p, dom0_createdomain_t *params, unsigned int num_vifs, char *data_start, unsigned long data_len, char *cmdline, unsigned long initrd_len); extern int final_setup_guestos(struct task_struct *p, dom0_builddomain_t *); -struct task_struct *find_domain_by_id(unsigned int dom); +struct task_struct *find_domain_by_id(domid_t dom); extern void release_task(struct task_struct *); extern void __kill_domain(struct task_struct *p); extern void kill_domain(void); extern void kill_domain_with_errmsg(const char *err); -extern long kill_other_domain(unsigned int dom, int force); +extern long kill_other_domain(domid_t dom, int force); extern void stop_domain(void); -extern long stop_other_domain(unsigned int dom); +extern long stop_other_domain(domid_t dom); /* arch/process.c */ void new_thread(struct task_struct *p, @@ -247,7 +246,7 @@ void schedulers_start(void); void sched_add_domain(struct task_struct *p); int sched_rem_domain(struct task_struct *p); long sched_bvtctl(unsigned long ctx_allow); -long sched_adjdom(int dom, unsigned long mcu_adv, unsigned long warp, +long sched_adjdom(domid_t dom, unsigned long mcu_adv, unsigned long warp, unsigned long warpl, unsigned long warpu); void init_idle_task(void); void __wake_up(struct task_struct *p); @@ -287,7 +286,7 @@ void continue_nonidle_task(void); /* This hash table is protected by the tasklist_lock. */ #define TASK_HASH_SIZE 256 -#define TASK_HASH(_id) ((_id)&(TASK_HASH_SIZE-1)) +#define TASK_HASH(_id) ((int)(_id)&(TASK_HASH_SIZE-1)) extern struct task_struct *task_hash[TASK_HASH_SIZE]; #define REMOVE_LINKS(p) do { \ diff --git a/xen/include/xeno/vif.h b/xen/include/xeno/vif.h index 2622a2929e..0cd2e4dec4 100644 --- a/xen/include/xeno/vif.h +++ b/xen/include/xeno/vif.h @@ -94,11 +94,11 @@ do { \ } while (0) \ /* vif prototypes */ -net_vif_t *create_net_vif(int domain); +net_vif_t *create_net_vif(domid_t dom); void destroy_net_vif(net_vif_t *vif); void unlink_net_vif(net_vif_t *vif); net_vif_t *net_get_target_vif(u8 *data, unsigned int len, net_vif_t *src_vif); -net_vif_t *find_vif_by_id(unsigned long id); +net_vif_t *find_net_vif(domid_t dom, unsigned int idx); /* * Return values from net_get_target_vif: diff --git a/xen/net/dev.c b/xen/net/dev.c index 167e8ce072..48c7a58295 100644 --- a/xen/net/dev.c +++ b/xen/net/dev.c @@ -642,7 +642,7 @@ static void net_rx_action(struct softirq_action *h) skb->data, skb->len, skb->src_vif); if ( !VIF_LOCAL(skb->dst_vif) ) - skb->dst_vif = find_vif_by_id(0); + skb->dst_vif = find_net_vif(0, 0); if ( skb->dst_vif != NULL ) { diff --git a/xenolinux-2.4.24-sparse/arch/xeno/drivers/dom0/vfr.c b/xenolinux-2.4.24-sparse/arch/xeno/drivers/dom0/vfr.c index f3725db6c1..9eca42de56 100644 --- a/xenolinux-2.4.24-sparse/arch/xeno/drivers/dom0/vfr.c +++ b/xenolinux-2.4.24-sparse/arch/xeno/drivers/dom0/vfr.c @@ -22,6 +22,7 @@ static unsigned char readbuf[1024]; /* Helpers, implemented at the bottom. */ u32 getipaddr(const char *buff, unsigned int len); u16 antous(const char *buff, int len); +u64 antoull(const char *buff, int len); int anton(const char *buff, int len); static int vfr_read_proc(char *page, char **start, off_t off, @@ -141,11 +142,14 @@ static int vfr_write_proc(struct file *file, const char *buffer, /* NB. Prefix matches must go first! */ if (strncmp(&buffer[fs], "src", fl) == 0) { - op.u.net_rule.src_vif = VIF_ANY_INTERFACE; + + op.u.net_rule.src_dom = VIF_SPECIAL; + op.u.net_rule.src_idx = VIF_ANY_INTERFACE; } else if (strncmp(&buffer[fs], "dst", fl) == 0) { - op.u.net_rule.dst_vif = VIF_PHYSICAL_INTERFACE; + op.u.net_rule.dst_dom = VIF_SPECIAL; + op.u.net_rule.dst_idx = VIF_PHYSICAL_INTERFACE; } else if (strncmp(&buffer[fs], "srcaddr", fl) == 0) { @@ -181,19 +185,19 @@ static int vfr_write_proc(struct file *file, const char *buffer, } else if (strncmp(&buffer[fs], "srcdom", fl) == 0) { - op.u.net_rule.src_vif |= anton(&buffer[ts], tl)<= '0') && (c <= '9') ) + { + ret *= 10; + ret += c - '0'; + buff++; len--; + } + + return ret; +} + u32 getipaddr(const char *buff, unsigned int len) { char c; diff --git a/xenolinux-2.4.24-sparse/arch/xeno/drivers/network/network.c b/xenolinux-2.4.24-sparse/arch/xeno/drivers/network/network.c index 075acdf5af..29f7c2224f 100644 --- a/xenolinux-2.4.24-sparse/arch/xeno/drivers/network/network.c +++ b/xenolinux-2.4.24-sparse/arch/xeno/drivers/network/network.c @@ -498,16 +498,20 @@ static int inetdev_notify(struct notifier_block *this, else goto out; - op.u.net_rule.src_vif = idx; - op.u.net_rule.dst_vif = VIF_PHYSICAL_INTERFACE; + op.u.net_rule.src_dom = 0; + op.u.net_rule.src_idx = idx; + op.u.net_rule.dst_dom = VIF_SPECIAL; + op.u.net_rule.dst_idx = VIF_PHYSICAL_INTERFACE; op.u.net_rule.src_addr = ntohl(ifa->ifa_address); op.u.net_rule.src_addr_mask = ~0UL; op.u.net_rule.dst_addr = 0; op.u.net_rule.dst_addr_mask = 0; (void)HYPERVISOR_network_op(&op); - op.u.net_rule.src_vif = VIF_ANY_INTERFACE; - op.u.net_rule.dst_vif = idx; + op.u.net_rule.src_dom = VIF_SPECIAL; + op.u.net_rule.src_idx = VIF_ANY_INTERFACE; + op.u.net_rule.dst_dom = 0; + op.u.net_rule.dst_idx = idx; op.u.net_rule.src_addr = 0; op.u.net_rule.src_addr_mask = 0; op.u.net_rule.dst_addr = ntohl(ifa->ifa_address); @@ -539,7 +543,7 @@ int __init init_module(void) * addresses. All other domains have a privileged "parent" to do this for * them at start of day. */ - if ( start_info.dom_id == 0 ) + if ( start_info.flags & SIF_INITDOMAIN ) (void)register_inetaddr_notifier(¬ifier_inetdev); err = request_irq(NET_IRQ, network_interrupt, @@ -619,7 +623,7 @@ static void cleanup_module(void) kfree(dev); } - if ( start_info.dom_id == 0 ) + if ( start_info.flags & SIF_INITDOMAIN ) (void)unregister_inetaddr_notifier(¬ifier_inetdev); } diff --git a/xenolinux-2.4.24-sparse/arch/xeno/kernel/head.S b/xenolinux-2.4.24-sparse/arch/xeno/kernel/head.S index d9934d1f5b..361815a58b 100644 --- a/xenolinux-2.4.24-sparse/arch/xeno/kernel/head.S +++ b/xenolinux-2.4.24-sparse/arch/xeno/kernel/head.S @@ -9,8 +9,8 @@ #include /* Offsets in start_info structure */ -#define MOD_START 20 -#define MOD_LEN 24 +#define MOD_START 16 +#define MOD_LEN 20 startup_32: cld diff --git a/xenolinux-2.4.24-sparse/arch/xeno/kernel/ioport.c b/xenolinux-2.4.24-sparse/arch/xeno/kernel/ioport.c index ed6dbbc3c5..fc0164045f 100644 --- a/xenolinux-2.4.24-sparse/arch/xeno/kernel/ioport.c +++ b/xenolinux-2.4.24-sparse/arch/xeno/kernel/ioport.c @@ -30,7 +30,7 @@ asmlinkage int sys_iopl(unsigned int new_io_pl) /* Force the change at ring 0. */ op.cmd = DOM0_IOPL; - op.u.iopl.domain = start_info.dom_id; + op.u.iopl.domain = DOMID_SELF; op.u.iopl.iopl = new_io_pl; HYPERVISOR_dom0_op(&op); diff --git a/xenolinux-2.4.24-sparse/arch/xeno/kernel/process.c b/xenolinux-2.4.24-sparse/arch/xeno/kernel/process.c index ff64bccd4c..78820a8b15 100644 --- a/xenolinux-2.4.24-sparse/arch/xeno/kernel/process.c +++ b/xenolinux-2.4.24-sparse/arch/xeno/kernel/process.c @@ -394,7 +394,7 @@ void __switch_to(struct task_struct *prev_p, struct task_struct *next_p) { dom0_op_t op; op.cmd = DOM0_IOPL; - op.u.iopl.domain = start_info.dom_id; + op.u.iopl.domain = DOMID_SELF; op.u.iopl.iopl = next->io_pl; queue_multicall1(__HYPERVISOR_dom0_op, (unsigned long)&op); } diff --git a/xenolinux-2.4.24-sparse/arch/xeno/kernel/setup.c b/xenolinux-2.4.24-sparse/arch/xeno/kernel/setup.c index be70b26ce3..4856250089 100644 --- a/xenolinux-2.4.24-sparse/arch/xeno/kernel/setup.c +++ b/xenolinux-2.4.24-sparse/arch/xeno/kernel/setup.c @@ -318,14 +318,14 @@ void __init setup_arch(char **cmdline_p) { dom0_op_t op; op.cmd = DOM0_IOPL; - op.u.iopl.domain = start_info.dom_id; + op.u.iopl.domain = DOMID_SELF; op.u.iopl.iopl = 1; if( HYPERVISOR_dom0_op(&op) != 0 ) panic("Unable to obtain IOPL, despite being SIF_PRIVILEGED"); current->thread.io_pl = 1; } - if(start_info.flags & SIF_CONSOLE) + if ( start_info.flags & SIF_INITDOMAIN ) { if( !(start_info.flags & SIF_PRIVILEGED) ) panic("Xen granted us console access but not privileged status"); diff --git a/xenolinux-2.4.24-sparse/arch/xeno/kernel/time.c b/xenolinux-2.4.24-sparse/arch/xeno/kernel/time.c index bf43b6a99b..875a216fb0 100644 --- a/xenolinux-2.4.24-sparse/arch/xeno/kernel/time.c +++ b/xenolinux-2.4.24-sparse/arch/xeno/kernel/time.c @@ -297,7 +297,7 @@ void do_settimeofday(struct timeval *tv) { struct timeval newtv; - if ( !independent_wallclock && (start_info.dom_id != 0) ) + if ( !independent_wallclock && !(start_info.flags & SIF_INITDOMAIN) ) return; write_lock_irq(&xtime_lock); @@ -333,7 +333,7 @@ void do_settimeofday(struct timeval *tv) last_update_from_xen = 0; #ifdef CONFIG_XENO_PRIV - if ( start_info.dom_id == 0 ) + if ( start_info.flags & SIF_INITDOMAIN ) { dom0_op_t op; last_update_to_rtc = last_update_to_xen = 0; @@ -445,7 +445,8 @@ static inline void do_timer_interrupt(int irq, void *dev_id, } #ifdef CONFIG_XENO_PRIV - if ( (start_info.dom_id == 0) && ((time_status & STA_UNSYNC) == 0) ) + if ( (start_info.flags & SIF_INITDOMAIN) && + ((time_status & STA_UNSYNC) == 0) ) { /* Send synchronised time to Xen approximately every minute. */ if ( xtime.tv_sec > (last_update_to_xen + 60) ) diff --git a/xenolinux-2.4.24-sparse/include/asm-xeno/keyboard.h b/xenolinux-2.4.24-sparse/include/asm-xeno/keyboard.h index 6d6461dfb9..4afd25cd42 100644 --- a/xenolinux-2.4.24-sparse/include/asm-xeno/keyboard.h +++ b/xenolinux-2.4.24-sparse/include/asm-xeno/keyboard.h @@ -1,6 +1,9 @@ /* xenolinux/include/asm-xeno/keyboard.h */ /* Portions copyright (c) 2003 James Scott, Intel Research Cambridge */ -/* Talks to hypervisor to get PS/2 keyboard and mouse events, and send keyboard and mouse commands */ +/* + * Talks to hypervisor to get PS/2 keyboard and mouse events, and send keyboard + * and mouse commands + */ /* Based on: * linux/include/asm-i386/keyboard.h @@ -50,7 +53,7 @@ extern unsigned char pckbd_sysrq_xlate[128]; static inline int xen_kbd_controller_present () { - return start_info.flags & SIF_CONSOLE; + return start_info.flags & SIF_INITDOMAIN; } /* resource allocation */ -- 2.30.2